2016-03-26 101 views
1

我正在使用导航抽屉切换片段,但即使在更改片段时,第一个片段中的元素仍然存在。片段元素即使在片段已更改时仍保留

主要活动的代码:

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

     ... 
     Drawer result = new DrawerBuilder() 
       .withActivity(this) 
       .withToolbar(toolbar) 
       .addDrawerItems(
         item1, 
         new DividerDrawerItem(), 
         item2, 
         new SecondaryDrawerItem().withName(R.string.drawer_item_settings) 
       ) 
       .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { 
        @Override 
        public boolean onItemClick(View view, int position, IDrawerItem drawerItem) { 
         // do something with the clicked item :D 
         FragmentManager manager = getSupportFragmentManager(); 
         FragmentTransaction transaction = manager.beginTransaction(); 
         Fragment fragment = new Fragment(); 

         switch (position) 
         { 
          case 0: 
           fragment = new HomeFragment(); 
           Log.d("Switch", "Search"); 
           break; 
          case 1: 

           break; 
          case 2: 
           fragment = new InventoryFragment(); 
           Log.d("Switch", "Inventory"); 
           break; 
          case 3: 
           fragment = new SettingsFragment(); 
           Log.d("Switch", "Settings"); 
           break; 
         } 

         transaction.replace(R.id.main_frame, fragment); 
         transaction.commit(); 
         return false; 
        } 
       }) 
       .build(); 
    } 

下面是从主页片段activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    android:background="?android:windowBackground" 
    tools:context="com.example.nihal.xchange.MainActivity"> 

    ... 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:id="@+id/main_frame"> 
     <fragment 
      android:name="com.example.nihal.xchange.HomeFragment" 
      android:id="@+id/current_fragment" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" /> 

    </FrameLayout> 
</android.support.design.widget.CoordinatorLayout> 

元素的代码保持横跨片段存在,但此行为不是由元件显示出的其他片段。 如何防止这种情况发生?

+0

当你在XML中添加一个片段,并与他人代替它,这个问题的存在.. 。更好地创建并动态添加它。 –

回答

2

不要在xml中包含Home碎片。保持您的容器FrameLayout为空,并在活动开始后立即添加初始片段。在Activity的onCreate方法中,首先动态添加Home片段。

activity_main.xml中 -

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_weight="1" 
    android:id="@+id/main_frame"> 

    <!-- Removed the fragment from here --> 

</FrameLayout> 

在OnCreate(),动态地添加它 -

if (findViewById(R.id.main_frame) != null) { 
     if (savedInstanceState != null) 
      return; 

    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    transaction.add(R.id.main_frame, new HomeFragment()); 
    transaction.commit(); 
} 
+0

每次调用onCreate时,您都会创建一个新的Fragment,更好地执行findFragmentById或Tag,然后执行空检查,仅在必要时实例化,然后添加到事务中。 –

+0

我不这么认为!只有当savedInstanceState等于null时,才会创建新片段,其中碎片也会被销毁。 –

+0

当然,我的不好,你是对的!在我的辩护中,我想我看到你的预编辑版本没有包括它.. –