为什么我的片段参考在轮换时仍然存在?

时间:2017-02-26 12:44:20

标签: android android-fragments landscape-portrait screen-rotation

我有一个简单的活动,有两个布局:一个用于肖像,另一个用于横向。

  • Portrait One包含一个简单的ListView。
  • 横向布局包含相同的ListView,以及以XML格式添加的其他片段。

我用一张纸勾勒出它,试图让它更清晰。原谅我糟糕的绘画技巧: problem_description

那是怎么回事?

首次启动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) {
           // ...
        }
}

这里有两个选项:

  1. 用户启动了纵向活动。因此,不存在片段,因此 mapFragment为空
  2. 活动以横向模式启动。在这种情况下,实际上找到了对Fragment的引用,并且 mapFragment不为null
  3. 这里没什么新东西。

    现在......如果活动是在景观中开始的话会有什么期望 - >去了肖像(用户旋转手机)? 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);
    }
    

    唷!我们必须在这里完成。让我们调试应用程序并查看它!

    1. 我们开始肖像活动。检查mapFragment。返回null。
    2. 我们转向景观。检查mapFragment。返回Fragment引用。没问题。
    3. 我们旋转回肖像。检查mapFragment。惊喜!尽管我们非常有意识地将它清理干净,但它仍然记得Fragment好像是在后面的堆栈中。
    4. 思想吗

      PD:我甚至尝试在onStop()中将mapFragment设置为null。显然不起作用,因为在旋转屏幕后不需要这样做(我们从onCreate中设置mapFragment,在每次设备配置更改后调用它。)

0 个答案:

没有答案