使用碎片时处理方向更改的正确方法是什么?
我有一个包含2个片段的横向布局(在代码中实例化为FrameLayouts).当我切换到纵向模式(其布局仅包含仅FrameLayout保留左窗格的模式)时,不再需要右侧片段.
我收到一个错误:
E/AndroidRuntime(4519): Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f060085 for fragment myFragment{418a2200 #2 id=0x7f060085}
Run Code Online (Sandbox Code Playgroud)
假设是我的活动试图重新附加在方向更改之前的片段,但由于包含片段的视图在纵向模式下不存在,因此会引发错误.
我尝试了以下隐藏/删除/分离方法,但仍然得到错误.告诉片段不再需要它的正确方法是什么,不要尝试显示?
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragholder2);
//rightPane is a framelayout that holds my fragment.
if (rightPane == null && f != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.hide(f); // This doesnt work
ft.remove(f); // neither does this
ft.detach(f); // or this
ft.commit;
}
}
Run Code Online (Sandbox Code Playgroud) 事先搜索过这个问题,我可以找到很多关于Fragment从a中动态添加和删除所选s的讨论ViewPager.然而,我真正关心的是如何以编程方式ViewPager从包含中删除整个'干净利落' ViewGroup,当ViewPager用于Fragment通过a 显示s时FragmentPagerAdapter,确保包含的Fragments被正确销毁.
为了进一步扩展这个问题,我有一个横向双窗格布局,其中从Fragment左侧的列表中进行选择,然后选择的内容放在a的右侧FrameLayout.关键是内容可能会或可能不会被分页.因此,内容必须以ViewPager格式显示,或者如果没有分页,则应Fragment直接用单个表示.
为了显示单个Fragment,我只需FragmentTransaction像往常一样执行以便将其Fragment放入FrameLayout容器中.另一方面,如果要显示的是分页内容,那么我创建一个ViewPager并将其添加为FrameLayout.
当我需要更改内容时,如果以前的内容是独立的,Fragment那么我可以直接删除它FragmentTransaction .remove().当我这样做时,按预期Fragment进行onPause()... onDestroy()循环.如果之前的内容是a,ViewPager那么我将其从FrameLayout使用中删除.removeAllViews().在这里,我来了问题:我看不到任何的onPause()... onDestroy()方法被称为在任何的Fragment举行之内,且s ViewPager通过FragmentPagerAdapter.
从用户的角度来看,应用程序运行正常.经过几轮ViewPager被移除后,我可以看到GC回收内存.但是,我不喜欢这样一个事实:那些Fragment生命方式的终结方法没有被调用,因为我不能在它们内部做任何清理,而且它似乎并不"正确".
有没有我可以以勾去掉进入一个方法ViewPager的Fragment当S ViewPager从其母体分离,也许?换句话说,当我知道 …