这是以编程方式调用Fragment的正确方法吗?

时间:2016-10-07 21:17:34

标签: android android-fragments

我的代码:

public class MainActivity extends AppCompatActivity {
    private FragmentA fragmentA;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            fragmentA = FragmentA.newInstance();
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_a_container, fragmentA, "FRAGMENT_A");
            fragmentTransaction.commit();
        }
        else {
            fragmentA = (FragmentA) getSupportFragmentManager().findFragmentByTag("FRAGMENT_A");
        }
    }

}

我真的不知道自己在做什么,但这是我现在所做的。我为Fragment定义了一个容器,然后我使用FragmentTransaction将它替换为Fragment。我感到困惑的部分是else语句。

  1. 我应该以不同的方式构建这个吗?

  2. 我认为配置更改消除了活动和碎片,那么为什么要检查一些支持管理器中的Fragment?这是否意味着片段实际上没有被销毁?与此同时,除非我使用onSaveInstanceStategetArguments()方法,否则它们似乎会被破坏,因为它们似乎已重置。

  3. 编辑:这样做有什么不对:

    public class MainActivity extends AppCompatActivity {
        private FragmentA fragmentA;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            fragmentA = FragmentA.newInstance();
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_a_container, fragmentA, "FRAGMENT_A");
            fragmentTransaction.commit();
        }
    
    }
    

1 个答案:

答案 0 :(得分:1)

在配置更改时,它们会被摧毁并重新创建,在本例中为SupportFragmentManager

回答你的问题:

  
      
  1. 我应该以不同的方式构建这个吗?
  2.   

不,如果没有保存状态,那么你应该如何创建片段,并在有状态时检索它们。另请参阅我的回答here;

  
      
  1. a)为什么要在某个支持经理中检查片段?
  2.   

因为管理器在配置更改时为您处理片段的生命周期。

  
      
  1. b)这是否意味着片段实际上没有被破坏?
  2.   

不,它确实被摧毁了。请参阅此diagram以获取参考。

编辑以回答评论中的一些问题:

  

但是Fragment中的任何成员变量在配置更改时都会完全丢失,除非我将它们保存在Fragment的onSaveInstanceState中,对吗?

这是正确的。由于您的片段正在被销毁,因此onSaveInstanceState上未保存的所有内容都将丢失。

  

那么我究竟要恢复什么?

你没有恢复任何东西。您只检索对先前创建的片段的引用。您可以在片段的onRestoreInstanceState()方法上恢复变量。

  

这样做有什么问题(问题编辑中的代码)?

如果您这样做,则要向R.id.fragment_a_container容器添加新的片段实例。因此,旧片段将与您在onSaveInstanceState()上保存的状态一起丢失。它将是一个新片段,其中包含新信息,并且不会为其调用<{1}} 事件。