Android 旋转后找不到片段id 0x的视图?
我正在把一些碎片装进一个容器里,里面还有一个导航抽屉。 当旋转屏幕,然后再旋转回来时,应用程序崩溃: 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} 在进入横向模式后,返回到纵向模式时,我遇到了这个错误。有趣的是,我没有加载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)用于片段 碎片分类
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
。从这里得到: