我有一个简单的活动,有两个布局:一个用于肖像,另一个用于横向。
那是怎么回事?
首次启动Activity时(无论是纵向还是横向),我尝试以编程方式获取对Fragment的引用,如下所示:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map_fragment);
if (mapFragment != null) {
// ...
}
}
这里有两个选项:
这里没什么新东西。
现在......如果活动是在景观中开始的话会有什么期望 - >去了肖像(用户旋转手机)? mapFragment包含什么? null?否。
我希望mapFragment在旋转到Portrait时为null,其中Fragment不存在。但是looking at the docs for the findFragmentById() method,我们可以看到:
[...]搜索当前添加的片段 对经理的活动; 如果没有找到这样的片段,则全部 当前位于与此ID关联的后台堆栈上的片段是 搜索
很酷,所以我明白我错了。 My Fragment曾在Landscape中存在,当用户旋转回Portrait时,Fragment仍然存在于Back Stack中。所以这是消除碎片堆栈的问题,或者是它?是的,一定是它。
好吧,让我们覆盖onSaveInstanceState(),我们将能够清除后面的堆栈(因为,惊喜......在onSaveInstanceState()方法被触发后无法完成!)。让我们来看看:
@Override
protected void onSaveInstanceState(Bundle outState) {
getSupportFragmentManager().popBackStack(null, getSupportFragmentManager().POP_BACK_STACK_INCLUSIVE);
super.onSaveInstanceState(outState);
}
唷!我们必须在这里完成。让我们调试应用程序并查看它!
思想吗
PD:我甚至尝试在onStop()中将mapFragment设置为null。显然不起作用,因为在旋转屏幕后不需要这样做(我们从onCreate中设置mapFragment,在每次设备配置更改后调用它。)