Android 旋转后找不到片段id 0x的视图?

Android 旋转后找不到片段id 0x的视图?,android,android-layout,rotation,fragment,android-support-library,Android,Android Layout,Rotation,Fragment,Android Support Library,我正在把一些碎片装进一个容器里,里面还有一个导航抽屉。 当旋转屏幕,然后再旋转回来时,应用程序崩溃: java.lang.RuntimeException:无法启动活动 ComponentInfo{lu.gian.uniwhere.alfa/com.example.alfa.ActivityHome}: java.lang.IllegalArgumentException:找不到id为0x7f0b004e的视图 (com.example.alfa:id/taxes_pager)用于片段 碎片分类

我正在把一些碎片装进一个容器里,里面还有一个导航抽屉。 当旋转屏幕,然后再旋转回来时,应用程序崩溃:

java.lang.RuntimeException:无法启动活动 ComponentInfo{lu.gian.uniwhere.alfa/com.example.alfa.ActivityHome}: java.lang.IllegalArgumentException:找不到id为0x7f0b004e的视图 (com.example.alfa:id/taxes_pager)用于片段 碎片分类表id{b5969898#2 id=0x7f0b004e}

在进入横向模式后,返回到纵向模式时,我遇到了这个错误。有趣的是,我没有加载
FragmentTaxes
(也就是说,一个
ViewPager
),而是完全另一个片段(fragmentoverview-没有什么特别要注意的)

从FragmentSession(也是
ViewPager
holder)返回时,它会抛出完全相同的错误:

java.lang.RuntimeException:无法启动活动 ComponentInfo{lu.gian.uniwhere.alfa/com.example.alfa.ActivityHome}: java.lang.IllegalArgumentException:找不到id为0x7f0b000f的视图 (com.example.alfa:id/session_pager)用于片段 分段会话应用{b5afa300#1 id=0x7f0b000f}

我尝试了一切(不保留片段实例,将它们放在后堆栈中,用
FrameLayout
替换
Frame
xml标记,为当时的横向模式创建特定布局,等等),但几乎没有任何效果。 我认为这是由于碎片生命周期造成的,因为崩溃是变化无常的,并且很难调试,但是很难理解如何解决这类问题

活动主页

public void selectItem(int position) {
        // ...
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
                    .addToBackStack(null)
                    .replace(R.id.content_frame, fragment)
                    .commit();
    mDrawerList.setItemChecked(position, true);
    setTitle(mDrawerTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}
<android.support.v4.widget.DrawerLayout
    ... >

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


    <!-- The navigation drawer  .... -->

</android.support.v4.widget.DrawerLayout>
活动之家

public void selectItem(int position) {
        // ...
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
                    .addToBackStack(null)
                    .replace(R.id.content_frame, fragment)
                    .commit();
    mDrawerList.setItemChecked(position, true);
    setTitle(mDrawerTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}
<android.support.v4.widget.DrawerLayout
    ... >

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


    <!-- The navigation drawer  .... -->

</android.support.v4.widget.DrawerLayout>
碎片税

    View rootView = inflater.inflate(R.layout.fragment_taxes, container, false);
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    ... >

    <!-- Loader -->
    <include
        android:id="@+id/taxes_main_progress"
        layout="@layout/indeterminate_activity_bar" />

    <android.support.v4.view.ViewPager
        android:visibility="gone"
        android:id="@+id/taxes_pager"
        ... >

        <android.support.v4.view.PagerTabStrip
            android:id="@+id/taxes_pager_tab_strip"
            ... />
    </android.support.v4.view.ViewPager>

</RelativeLayout>


如果需要,我会发布更多的代码片段。现在我不知道了,我想这可能会导致阅读混乱。

这都是由于
setRetainInstance(true)
。我认为在两个ViewPager中将其设置为false就足够了。实际上不是。 我把它从单个(嵌套的)片段中移除,一切都很顺利

看起来嵌套片段无法处理
setRetainInstance
。从这里得到: