2016-03-26 131 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

當然,我的不好,你是對的!在我的辯護中,我想我看到你的預編輯版本沒有包括它.. –