2015-06-21 37 views
0

我開發了一個具有一些菜單的材質NavigationDrawer。每個菜單都與單個片段相關聯。我想讓我的FragmentHome()始終在後臺存活,以便每當我切換到不同的片段並返回時,FragmentHome()都應該像以前一樣存在。Android - 將第一個片段保存在backstack中,並且在替換時不重新創建實例

這是我創建的片段的XML,

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <include layout="@layout/toolbar" /> 

    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 

     <FrameLayout 
      android:id="@+id/container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

     <fragment 
      android:id="@+id/navigation_drawer" 
      android:name="NavigationDrawerFragment" 
      android:layout_width="240dp" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" /> 
    </android.support.v4.widget.DrawerLayout> 

</LinearLayout> 

這是我如何創建和更換片段,

@Override 
    public void onNavigationDrawerItemSelected(int position) { 
    Fragment fragment = null; 
    String title = getString(R.string.app_name); 

     switch (position) { 
     case 0: 
      fragment = new FragmentHome(); 
      title = getString(R.string.app_name); 

      break; 
     case 1: 
      fragment = new FragmentCategories(); 
      title = getString(R.string.title_categories); 

     case 2: 
      fragment = new FragmentMyPlaylist(); 
      title = getString(R.string.title_playlist); 

     if (fragment != null) { 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      fragmentTransaction.replace(R.id.container, fragment); 
      fragmentTransaction.commit(); 

      // set the toolbar title 
      getSupportActionBar().setTitle(title); 
     } 
} 

我現在面臨的主要問題是,每當我更換它們時,每個片段都是從頭開始創建的。這很煩人,當它們已經被創建一次時,HomeFramgent()的所有組件都被重新創建。

UPDATE:

我做了這個問題,它是在XML創建個人framents,並通過主容器代替他們另一種解決方案,

對於這個第一,我創​​建的各個片段是與該片類相關聯,

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <include layout="@layout/toolbar" /> 

    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 

     <FrameLayout 
      android:id="@+id/container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

     <fragment 
      android:id="@+id/FragmentHome" 
      android:name="FragmentHome" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
     <fragment 
      android:id="@+id/FragmentCategories" 
      android:name="FragmentCategories" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
     <fragment 
      android:id="@+id/FragmentMyPlaylist" 
      android:name="FragmentMyPlaylist" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

     <fragment 
      android:id="@+id/navigation_drawer" 
      android:name="NavigationDrawerFragment" 
      android:layout_width="240dp" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" /> 
    </android.support.v4.widget.DrawerLayout> 

</LinearLayout> 

然後我的主要活動,宣佈每個片段用ID,

FragmentManager fm = getSupportFragmentManager(); 
     fragments[HOME] = fm.findFragmentById(R.id.FragmentHome); 
     fragments[CATEGORIES] = fm.findFragmentById(R.id.FragmentCategories); 
     fragments[PLAYLIST] = fm.findFragmentById(R.id.FragmentMyPlaylist); 
     FragmentTransaction transaction = fm.beginTransaction(); 

     for (int i = fragments.length - 1; i > 0; i--) { 
      transaction.hide(fragments[i]); 
     } 
     transaction.commit(); 

現在whenver我想更換一個frament我做這裏面onNavigationDrawerItemSelected(),

fragmentManager.beginTransaction().replace(R.id.container, new 
FragmentHome()).commit(); 

這解決了重新創建每個片段的問題,並在應用程序運行後,將創建一次。這又給我一個不刷新其他片段的限制。所有的片段都是一次創建的,而不是在更改時重新創建,這是我不想要的。

我正在尋找一種有效的方法,以便只有FragmentHome()將保留在backstace中,並且所有其他片段將在更換時刷新。

任何形式的幫助將不勝感激......

回答

相關問題