我有一个片段,它为选项菜单添加了一个选项。单击此选项时,将打开一个对话框片段。该对话框将原始片段设置为其目标片段。如果在对话框片段打开时没有发生方向更改,则目标片段与预期一样,但在方向更改后,目标片段将设置为对话框片段本身而不是先前设置的片段。因此,当我尝试将目标片段转换为设置为目标片段的片段时,我得到了一个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();
logcat的:
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
答案 0 :(得分:3)
setTargetFragment
不应用于建立父/子片段之间的关系。它只应用于链接兄弟片段(即同一FragmentManager
内存在的片段)。
它在父/子片段之间不起作用的原因是片段的目标被保存并作为其自己的 FragmentManager
的索引进行恢复。因此,在框架恢复活动之后,一切都将变得笨拙,例如,方向改变之后。此时,FragmentManager
将在自身内部而不是父FragmentManager
中查找目标片段。
答案 1 :(得分:2)
我仍然不明白为什么getTargetFragment对我来说不起作用,但用getParentFragment替换它解决了我的问题。
答案 2 :(得分:0)
这太迟了,但我今天遇到了这个问题,以为我会写下解决方案,以防有人需要。
这里的问题是您要将VirsārstsFragment的ChildFragmentManager传递给SearchDialogFragment。
FragmentManager fm = getChildFragmentManager();
SearchDialogFragment dialog = new SearchDialogFragment();
dialog.show(fm, "searchDialog");
相反,您需要传递普通的片段管理器(使用getFragmentManager()来获取它)。
我认为您的代码不是因为还原,因为系统在传递给SearchDialogFragment的childFrgamentManager中寻找VirsārstsFragment,但由于VirsārstsFragment实际上位于活动的片段管理器中而找不到它。将Activity的片段管理器传递给SearchDialogFragment可以解决此问题。
答案 3 :(得分:-4)
如果没有UI更改,您可以将属性configChanges添加到清单
中的活动<activity
android:name=".YourActivity"
android:configChanges="screenSize|orientation"/>
它的作用是指定在活动本身处理屏幕大小或方向更改时配置更改(在您的情况下没有任何更改,因此无需执行任何操作)
如果您将来需要处理任何更改,可以在活动中的onConfigurationChanged()中执行此操作。
请告诉我这是否适合你的情况