使用碎片时处理方向更改的正确方法是什么?
我有一个包含2个片段的横向布局(在代码中实例化为 FrameLayout
) . 当我切换到纵向模式(其布局仅包含一个仅保留左窗格的 FrameLayout
)时,不再需要右侧片段 .
我收到一个错误:
E/AndroidRuntime(4519): Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f060085 for fragment myFragment{418a2200 #2 id=0x7f060085}
假设是我的活动试图重新附加方向更改之前的片段,但由于包含片段的视图在纵向模式下不存在,因此会引发错误 .
我尝试了以下隐藏/删除/分离方法但仍然得到错误 . 告诉片段它不再需要的正确方法是什么,不要尝试显示?
@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;
}
}
7 回答
我遇到了同样的问题,我想我想出了另一个解决方案 . 此解决方案可能更好,因为您不必将片段添加到后台堆栈 .
从
Activity.onSaveInstanceState()
before 中调用super.onSaveInstanceState()
的活动中删除右侧片段 . 这对我有用:如果要保留片段,请尝试不保留它 .
代替
通常,您将有两个片段(左/右),一个主要活动和一个容器活动用于正确的片段(仅在电话设备上显示时) . 此博客文章中描述了这一点:The Android 3.0 Fragments API
如果您有一个带有左窗格和右窗格的双窗格活动,并且其中一个窗格(通常是右窗格)假设在设备切换到纵向模式时不显示,请让Android执行其操作并重新创建右窗格 . 但是在右窗格的onCreateView中,您应该做的第一件事是检查窗格使用的布局元素之一是否可用 . 如果不是,请使用FragmentManager删除片段并立即返回:
我想我已经解决了 .
我将片段添加到后台堆栈中,然后在活动关闭之前再将其弹出,这有效地消除了它 . 到目前为止似乎工作 .
Android会在屏幕旋转期间重新创建两个片段 . 但是如果你将下面的检查添加到onCreateView()中,它将阻止你解决问题:
我从Android Developers blog拿走了这个 .
您不再需要此活动,因为片段将以内嵌方式显示 . 所以你可以完成这项活动