我開發了一個具有一些菜單的材質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中,並且所有其他片段將在更換時刷新。
任何形式的幫助將不勝感激......