【发布时间】:2016-03-10 03:48:51
【问题描述】:
我创建了一个从 DialogFragment 扩展的类。它工作得很好,直到我在这个对话框中包含了一个 customTitle。我到现在为止的问题,发生在改变方向时,导致应用程序崩溃。
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tdms.stingymoney/com.example.tdms.stingymoney.ListAccounts}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3828)
at android.app.ActivityThread.access$800(ActivityThread.java:158)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1302)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5365)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:3566)
at android.view.ViewGroup.addView(ViewGroup.java:3437)
at android.support.v7.app.AlertController.setupTitle(AlertController.java:631)
at android.support.v7.app.AlertController.setupView(AlertController.java:462)
at android.support.v7.app.AlertController.installContent(AlertController.java:214)
at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:240)
at android.app.Dialog.dispatchOnCreate(Dialog.java:357)
at android.app.Dialog.onRestoreInstanceState(Dialog.java:423)
at android.support.v4.app.DialogFragment.onActivityCreated(DialogFragment.java:396)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1970)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1092)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1230)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2042)
at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:165)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:543)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1181)
at android.app.Activity.performStart(Activity.java:5336)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2234)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3828)
at android.app.ActivityThread.access$800(ActivityThread.java:158)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1302)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5365)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
我解决了上面在 onDestroyView 方法中将 null 设置为 customTitle 的崩溃,但是现在,当改变方向时,我失去了我的 customTitle...这是我现在的代码:
public class AlertDialogFragment extends DialogFragment{
View customTitle;
public interface OnYesNoResult{
void onDialogResult(boolean result, int requestCode);
}
public AlertDialogFragment(){}
public void setCustomTitleView(View view){
this.customTitle = view;
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstances){
this.setRetainInstance(true);
//
Dialog dialog = new AlertDialog.Builder(getActivity())
.setTitle("title")
.setCustomTitle(customTitle)
.setMessage("message")
.create();
return dialog;
}
@Override
public void onDestroyView() {
if (getDialog() != null && getRetainInstance())
getDialog().setDismissMessage(null);
super.onDestroyView();
customTitle = null;
if (view != null) {
ViewGroup parentViewGroup = (ViewGroup) view.getParent();
if (parentViewGroup != null) {
parentViewGroup.removeAllViews();
}
}
}
}
如何将我的 customTitle 保留在 DialogFragment 中,而不会在更改屏幕方向时导致应用崩溃或丢失?
谢谢!
【问题讨论】:
-
请移除 onDestroyView 调用,并且当您想要关闭对话框片段时使用dismissAllowingStateLoss() 并且当您想要显示对话框时通过片段管理器显示它。并确保您正确处理 onConfigurationChange 回调。如果您不想处理,请在清单中添加条目 android:configChanges="orientation|screenSize|screenLayout"
-
我记得,当屏幕改变方向时,它会通过 onDestroy() 然后重新创建。您是否尝试过覆盖 onCreate() 然后只是简单地在那里设置 customTitle?。
-
@sept 我唯一的问题是:我为什么要在 onDestroy 方法中删除他们父母的意见?
标签: android android-fragments android-dialogfragment dialogfragment