我正在努力解决方向改变时的片段丢失问题。 起初,我的片段似乎对方向变化反应良好,没有任何错误。 但例外的是当我导航回先前制作的片段时。因为我正在我的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语句)时,我的左右片段都显示空白屏幕。只有在调用案例1时才会发生这种情况,它似乎不记得那里的片段,即使片段管理器通过标签找到它们。
我也一直在检查我的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);
}
有什么方法可以解决这个问题吗?只有在改变方向后才会发生。
答案 0 :(得分:1)
这是因为在更改方向时会重新处理您的活动。
您可以解决此问题,在清单中添加android:configChanges="orientation|screenSize"
(阻止在方向更改时重新创建活动):
<activity
android:name="com.example.MyActivity"
android:configChanges="orientation|screenSize" >
</activity>