Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android-更改方向后目标片段在对话框片段中更改_Android_Android Fragments_Android Dialogfragment - Fatal编程技术网

android-更改方向后目标片段在对话框片段中更改

android-更改方向后目标片段在对话框片段中更改,android,android-fragments,android-dialogfragment,Android,Android Fragments,Android Dialogfragment,我有一个片段,它在选项菜单中添加了一个选项。单击此选项时,将打开一个对话框片段。对话框将原始片段设置为其目标片段。如果对话框片段打开时未发生方向更改,则目标片段与预期一致,但在方向更改后,目标片段将设置为对话框片段本身,而不是之前设置的片段。因此,在尝试将目标片段转换为设置为目标片段的片段时,我得到了classCastException。我需要在对话框中获取目标片段,因为它实现了回调(OnStartOrRestartLoader)。 我已经尝试解决这个问题一个多星期了,如果有人能给我指出正确的方

我有一个片段,它在选项菜单中添加了一个选项。单击此选项时,将打开一个对话框片段。对话框将原始片段设置为其目标片段。如果对话框片段打开时未发生方向更改,则目标片段与预期一致,但在方向更改后,目标片段将设置为对话框片段本身,而不是之前设置的片段。因此,在尝试将目标片段转换为设置为目标片段的片段时,我得到了classCastException。我需要在对话框中获取目标片段,因为它实现了回调(OnStartOrRestartLoader)。 我已经尝试解决这个问题一个多星期了,如果有人能给我指出正确的方向,我将不胜感激。因为这是我在这里的第一个问题,如果我排除了一些必要的信息,或者这不是一个合适的问题,我道歉

在实现OnStartOrRestartLoader的片段(VirsārstsFragment)中,我创建了如下对话框:

FragmentManager fm = getChildFragmentManager();
SearchDialogFragment dialog = new SearchDialogFragment();
dialog.show(fm, "searchDialog");
dialog.setTargetFragment(this, DIALOGFRAGMENT);
然后在SearchDialogFragment中,我执行以下操作来设置回调:

OnStartOrRestartLoader callback = (OnStartOrRestartLoader) getTargetFragment();
日志:

08-25 12:15:55.087: E/AndroidRuntime(10057): FATAL EXCEPTION: main
08-25 12:15:55.087: E/AndroidRuntime(10057): Process: com.example, PID: 10057
08-25 12:15:55.087: E/AndroidRuntime(10057): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MainActivity}: java.lang.ClassCastException: com.example.SearchDialogFragment cannot be cast to com.example.OnStartOrRestartLoader
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2224)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2273)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3759)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.app.ActivityThread.access$900(ActivityThread.java:141)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.os.Handler.dispatchMessage(Handler.java:102)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.os.Looper.loop(Looper.java:136)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.app.ActivityThread.main(ActivityThread.java:5052)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at java.lang.reflect.Method.invokeNative(Native Method)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at java.lang.reflect.Method.invoke(Method.java:515)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at dalvik.system.NativeStart.main(Native Method)
08-25 12:15:55.087: E/AndroidRuntime(10057): Caused by: java.lang.ClassCastException: com.example.SearchDialogFragment cannot be cast to com.example.OnStartOrRestartLoader
08-25 12:15:55.087: E/AndroidRuntime(10057):    at com.example.SearchDialogFragment.onCreateDialog(SearchDialogFragment.java:59)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:307)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:942)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1103)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1901)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1518)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:962)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1103)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1901)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:567)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.app.Activity.performStart(Activity.java:5322)
08-25 12:15:55.087: E/AndroidRuntime(10057):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2187)
08-25 12:15:55.087: E/AndroidRuntime(10057):    ... 13 more

我仍然不明白为什么
getTargetFragment()
对我不起作用,但用
getParentFragment()
替换它解决了我的问题。

如果没有UI更改,可以将属性configChanges添加到清单中的活动中

<activity
        android:name=".YourActivity"
        android:configChanges="screenSize|orientation"/>

这样做的目的是指定在活动本身处理屏幕大小或方向更改时配置更改(在您的情况下,没有更改,因此无需执行任何操作)

如果您将来需要处理任何更改,您可以在活动中的OnConfiguration Changed()中进行处理


让我知道这是否适用于您的情况

setTargetFragment
不应用于建立父/子片段之间的关系。它只能用于链接同级片段(即,存在于同一
FragmentManager
中的片段)


它在父/子片段之间不起作用的原因是片段的目标被保存并作为索引还原到它自己的
FragmentManager
。因此,在框架恢复某个活动(例如,方向更改)之前,一切都将非常顺利。此时,
FragmentManager
将在自身中查找目标片段,而不是父级
FragmentManager

这太晚了,但我今天遇到了这个问题,我想我应该写下我的解决方案,以防有人需要它

这里的问题是您正在将VirsārstsFragment的ChildFragmentManager传递给SearchDialogFragment

FragmentManager fm = getChildFragmentManager();
SearchDialogFragment dialog = new SearchDialogFragment();
dialog.show(fm, "searchDialog");
相反,您需要传递普通片段管理器(使用getFragmentManager()获取它)


我认为您的代码不正确,因为在还原时,系统会在您传递给SearchDialogFragment的childFrgamentManager中查找VirsārstsFragment,但找不到它,因为VirsārstsFragment实际上在活动的片段管理器中。将活动的片段管理器传递给SearchDialogFragment可以解决此问题。

您可以发布更多代码吗?您的UI是否会随着方向的改变而改变?我的意思是,每个方向都有不同的用户界面吗?我不明白
getTargetFragment()
返回一个
片段
,您试图将其强制转换到
OnStartOrRestartLoader
。例外情况非常明显。你想做什么?@Simon现在我想起来,你提到的是真的,但同样的问题仍然存在,即使我试图转换为扩展片段的VirsārstsFragment。我通过使用getParentFragment而不是getTargetFragment找到了解决方案。@pvn使用相同的UI。我以编程方式添加微调器和文本视图,并希望在旋转后保留它们的内容(这是有效的),当我单击正按钮时,我需要使用父片段中的新参数重新启动游标加载程序(仅在没有方向更改的情况下有效)。我还必须使用
getChildFragmentManager()
而不是
getFragmentManager()