Android在方向更改后找不到片段的视图
当我的设备方向改变时,我收到一个错误。在方向改变之前,一切正常 我有一个片段(TrapCheckContainerFragment),它包含一个用于保存另一个片段(TrapCheckFragment)的框架布局。TrapCheckFragment在TrapCheckContainerFragment的onCreateView方法中创建,并使用FragmentTransaction将其放置到FrameLayout中Android在方向更改后找不到片段的视图,android,android-fragments,Android,Android Fragments,当我的设备方向改变时,我收到一个错误。在方向改变之前,一切正常 我有一个片段(TrapCheckContainerFragment),它包含一个用于保存另一个片段(TrapCheckFragment)的框架布局。TrapCheckFragment在TrapCheckContainerFragment的onCreateView方法中创建,并使用FragmentTransaction将其放置到FrameLayout中 @Override public View onCreateView(Layout
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_trap_check_container, container, false);
TrapCheckFragment fragment = new TrapCheckFragment();
ReplaceFragment(R.id.trapCheckHolder, fragment, false, feature.trapUniqueID.toString());
return rootView;
}
private void ReplaceFragment(int idToReplace, Fragment newFragment, boolean addToBackStack, String tag){
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(idToReplace, newFragment, tag);
if(addToBackStack){
transaction.addToBackStack(null);
}
transaction.commit();
}
这一切都很好,直到我旋转设备。据我所知,没有调用任何代码,但由于某种原因,FragmentManager无法找到名为trapCheckHolder的视图,该视图是用于保存子片段的FrameLayout。如果我删除了对ReplaceFragment的调用,那么当我旋转设备时,一切正常
logcat消息:
FATAL EXCEPTION: main
Process: com.redacted.appname, PID: 29396
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.redacted.appname/com.redacted.appname.activities.MainActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f0a0042 (com.redacted.appname:id/trapCheckHolder) for fragment TrapCheckFragment{64fa6b18 #4 id=0x7f0a0042 10236}
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3724)
at android.app.ActivityThread.access$900(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1202)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f0a0042 (com.redacted.appname:id/trapCheckHolder) for fragment TrapCheckFragment{64fa6b18 #4 id=0x7f0a0042 10236}
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:882)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
at android.app.BackStackRecord.run(BackStackRecord.java:684)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
at android.app.Activity.performStart(Activity.java:5240)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157)
... 10 more
我已经尝试将这个片段和父片段的setRetainInstance设置为true和false,但这没有任何区别。我在这里做的有什么明显的错误吗?有没有办法强迫创建一个新的TrapCheckFragment,而不是试图显示导致这个问题的旧的TrapCheckFragment
如果需要,我可以提供有关任何代码或错误的更多信息。似乎是
onCreateViewMethod
导致了问题;如果容器为null,则必须返回null:
执行类似操作以检查空值并重新创建视图:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (rootView == null) {
// Inflate the layout for this fragment
rootView = inflater.inflate(R.layout.fragment_a, container, false);
} else {
// Do not inflate the layout again.
// The returned View of onCreateView will be added into the fragment.
// However it is not allowed to be added twice even if the parent is same.
// So we must remove rootView from the existing parent view group
// (it will be added back).
((ViewGroup)rootView.getParent()).removeView(rootView);
}
return rootView;
请检查,并让我知道它是否有效。在本例中,我应该如何获取_rootView?我尝试存储创建的rootView并调用getView(),但第一个从getParent()返回null,第二个在方向改变时返回null代码>第一次创建片段时,其始终为null。似乎rootView.getParent()返回null。我在调试时遇到了问题,因为如果安装了调试器并且在设备旋转后未命中任何断点,则应用程序会崩溃,而不会显示错误消息。