我試圖建立一個NavigationView一個活動,並儘可能多的片段作爲導航項目:竊聽 第一項 - >第一片段把隨機的遠程圖像; 第二項/第三項挖掘 - >其他片段加載。 我的目標是,在切換回第一項時,顯示已下載的圖像,而不是獲取新圖像。的片段總是空savedInstanceState在運行時(導航視圖)內置
activity_main.xml中
<android.support.v4.widget.DrawerLayout
(.....)
android:id="@+id/drawer_layout">
<!-- This LinearLayout represents the contents of the screen -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- The ActionBar displayed at the top -->
<include
layout="@layout/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<!-- The main content view where fragments are loaded -->
<FrameLayout
(......)
android:id="@+id/flContent"/>
</LinearLayout>
<!-- The navigation drawer that comes from the left -->
<android.support.design.widget.NavigationView
(.......)
android:id="@+id/nvView" />
MainActivity
public class MainActivity extends AppCompatActivity {
Fragment homeFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//......
setupDrawerContent(nvDrawer);
if (findViewById(R.id.flContent) != null && savedInstanceState == null) {
homeFragment = new HomeFragment();
getSupportFragmentManager().beginTransaction().add(R.id.flContent, homeFragment, "homeFragment").commit();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
getSupportFragmentManager().putFragment(outState, "homeFragment", homeFragment);
}
private void setupDrawerContent(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
selectDrawerItem(menuItem);
return true;
}
}
);
}
public void selectDrawerItem(MenuItem menuItem) {
// Create a new fragment and specify the item to show based on
// position
Fragment fragment = null;
Class fragmentClass = null;
switch(menuItem.getItemId()) {
case R.id.nav_first_fragment:
fragmentClass = HomeFragment.class;
break;
case R.id.nav_second_fragment:
fragmentClass = SecondFragment.class;
break;
default:
fragmentClass = HomeFragment.class;
}
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
// Highlight the selected item, update the title, and close the drawer
menuItem.setChecked(true);
setTitle(menuItem.getTitle());
mDrawer.closeDrawers();
}
}
HomeFragment
public class HomeFragment extends Fragment {
private static final String TAG = "HomeFragment";
public HomeFragment() {
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
// ......
View fragmentView = inflater.inflate(R.layout.home_fragment, container, false);
if (savedInstanceState == null) {
// FETCH RANDOM IMAGE
}else {
// RESTORE IT (but always null)
}
return fragmentView;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(/*SOME DATA*/);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
// ALWAYS NULL
}
}
}
我發現this的答案,但我不知道如何這樣做,因爲我只是有一個FrameLayout的參考。
跟蹤生命週期方法我注意到MainActivity總是處於活動狀態,所以它從不調用onSaveInstanceState,我不知道如何在我的HomeFragment中使用Bundle來恢復onCreateView中的savedInstanceState。 你有什麼提示分享? 非常感謝
感謝您的幫助! 因爲我紅了大量的討論強調束舞蹈的重要性,我是「肯定」,在這樣... 你給了我寶貴的解決方案,我一定會詳細探討,我真的很感激了! – Alekxs