我正在与方向改变时的碎片丢失作斗争。起初,我的片段似乎对方向变化反应良好,没有任何错误。但当我导航回以前创建的片段时例外。因为我要在我的fragmenthandler活动中检查它。
我选择使用一个大的if语句而不是switch case,因为这在我的知识掌握范围内。if语句的处理工作正常,已经使用日志语句对其进行了调试,似乎没有任何问题。下面是用于处理片段的代码,预先使用或创建一个新的片段。
public void fragmentHandle(Fragment fl, Fragment fr, String tl, String tr) {
Fragment cFragLeft = manager.findFragmentById(R.id.fragment_left);
Fragment cFragRight = manager.findFragmentById(R.id.fragment_right);
Fragment checkLeft = manager.findFragmentByTag(tl);
Fragment checkRight = manager.findFragmentByTag(tr);
FragmentTransaction ft = manager.beginTransaction();
if (cFragLeft != null && cFragRight != null && checkLeft != null
&& checkRight != null) {
ft.detach(cFragRight).detach(cFragLeft).attach(fr).attach(fl)
.addToBackStack(null).commit();
} else if (cFragLeft != null && cFragRight != null && checkLeft == null
&& checkRight == null) {
ft.detach(cFragLeft).detach(cFragRight)
.add(R.id.fragment_left, fl, tl)
.add(R.id.fragment_right, fr, tr).addToBackStack(null)
.commit();
} else if (cFragLeft != null && cFragRight != null && checkLeft == null
&& checkRight != null) {
ft.detach(cFragLeft).detach(cFragRight).attach(fr)
.add(R.id.fragment_left, fl, tl).addToBackStack(null)
.commit();
} else if (cFragLeft != null && cFragRight != null
&& checkRight == null && checkLeft != null) {
ft.detach(cFragLeft).detach(cFragRight).attach(fl)
.add(R.id.fragment_right, fr, tr).addToBackStack(null)
.commit();
} else {
ft.add(R.id.fragment_left, fl, tl).add(R.id.fragment_right, fr, tr)
.commit();
}
}当我更改方向,然后导航回以前保存的片段(第一个if语句)时,我的左右两个片段都显示为空白屏幕。只有在调用第一种情况时才会发生这种情况,它似乎不会记住存在的片段,即使fragmentmanager通过标记找到了它们。
我也一直在检查我的onCreate,如下所示。
protected void onCreate(Bundle savedInstanceState) {
// super.onCreate
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_handler);
if (savedInstanceState == null) {
fragmentHandle(nFragLeft, nFragRight, "menuMain", "main");
}
}为了完成,还包含了一个按钮语句。我没有使用过onClickListeners,也不确定我是否应该更喜欢它而不是xml onClick。
public void sendDestination(View v) {
nFragLeft = menudestFrag;
nFragRight = destFrag;
String tagLeft = "menuDestination";
String tagRight = "destination";
fragmentHandle(nFragLeft, nFragRight, tagLeft, tagRight);
}有什么办法可以解决这个问题吗?仅在更改方向后发生。
发布于 2013-11-27 17:47:39
这是因为当方向改变时,你的活动就会发生。
您可以在清单中添加android:configChanges="orientation|screenSize"来解决此问题(避免在方向更改时重新创建活动):
<activity
android:name="com.example.MyActivity"
android:configChanges="orientation|screenSize" >
</activity>https://stackoverflow.com/questions/20237528
复制相似问题