设备方向更改时出现错误。一切正常,直到方向发生变化。

我有一个片段(TrapCheckContainerFragment),其中包含一个FrameLayout,用于容纳另一个片段(TrapCheckFragment)。 TrapCheckFragment在TrapCheckContainerFragment的onCreateView方法中创建,并使用FragmentTransaction放置到FrameLayout中。

@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的调用,则在旋转设备时一切正常。

日志消息:

 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和父Fragment的setRetainInstance设置为true和false,但这没有任何区别。我在这里做什么显然有什么问题吗?有什么方法可以强制创建新的TrapCheckFragment,而不是尝试显示似乎是导致此问题的旧方法?

如果需要,我可以提供有关任何代码或错误的更多信息。

最佳答案

看来onCreateViewMethod引起了问题;如果容器为null,则必须返回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;


请检查,并让我知道它是否有效。

07-28 03:24
查看更多