Android片段在方向更改时复制/重新创建

时间:2017-07-05 14:23:34

标签: android android-fragments android-activity

我正在尝试在Fragments容器中显示两个FrameLayout。我一次只显示一个,并根据我的应用程序逻辑隐藏另一个。我相信每次改变设备方向时,都会重新创建!我可以看到重复的碎片相互重叠!怎么解决?提前谢谢。

public class MainActivity extends AppCompatActivity {

   final Fragment oneFragment = oneFragment.newInstance();
   final Fragment twoFragment = twoFragment.newInstance();
   Fragment active = oneFragment;

   final FragmentManager fm = getSupportFragmentManager();

@Override
   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       // some other code

        fm.beginTransaction().add(R.id.container, oneFragment, "1").commit();
        fm.beginTransaction().add(R.id.container, twoFragment, "2").commit();

        // onclick listener 
        if(condition) {
            fm.beginTransaction().hide(active)
            .show(oneFragment).commit();
        } else {    
            fm.beginTransaction().hide(active)
            .show(twoFragment).commit();
        }

      // some other code

2 个答案:

答案 0 :(得分:1)

在活动重新启动后,片段始终会自动从之前的状态恢复。

要避免此行为,只需检查savedInstanceState是否为空。 如果它为null - 我们有一个新的活动实例,如果没有 - 重新创建活动(因此,不需要再次添加碎片 - 它们已经存在)。

protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   if (savedInstanceState == null) {
      fm.beginTransaction().add(R.id.container, oneFragment, "1").commit();
      fm.beginTransaction().add(R.id.container, twoFragment, "2").commit();
   }
} 

看一下这篇文章(在运行时将一个片段添加到一个活动)以获取更多信息,它将帮助你实现片段魔术:) https://developer.android.com/training/basics/fragments/fragment-ui.html

答案 1 :(得分:0)

试试这个:

 if (condition) {
    replaceFragment(oneFragment, "1")
 } else {
    replaceFragment(twoFragment, "2")
 }

 private void replaceFragment(Fragment fragment, String tag) {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    transaction.addToBackStack(tag);
    transaction.replace(R.id.container, fragment, tag);
    transaction.commit();
}