2017-09-30 16 views
1

以前はフラグメントを扱っていましたが、これはビューページャーとtablayoutを使っていましたが、配列を作成してその配列からフラグメントを返すことでフラグメント状態を維持できました。ナビゲーションビューのフラグメントと子のバックスタック

ですが、現在はフラグメントマネージャを使用していますが、追加と置き換えにアクセスできますが、どちらも発生したことを保存せずに(つまりeditTextを入力して)フラグメントの新しいインスタンスを作成します。

メニューからナビゲートするときに作成したフラグメントを保持または再利用するにはどうすればよいですか(これらのフラグメントの中には子供のバックスタックがあることを覚えておいてください、バックボタンはメインフラグメントではなく、 )

編集解決

private void initNavigation(){ 
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

    /* Initialize fragments for navigation drawer */ 
    fragments = new Fragment[]{ 
      new ProfileFragment(), 
      new StatsFragment()}; 

    /* Set selection of navigation item */ 
    nav_view = (NavigationView) findViewById(R.id.nav_view); 
    nav_view.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
        item.setChecked(true); 

        FragmentManager fragmentManager = getSupportFragmentManager(); 
        switch (item.getItemId()) { 
         case R.id.nav_routine: 
          if(fragmentManager.findFragmentByTag("TAG0") != null){ 
           Log.i("fm", "reloading profile frag"); 
           fragmentManager.beginTransaction().replace(R.id.content_main, 
             fragmentManager.findFragmentByTag("TAG0"), "TAG0"); 
          } else{ 
           fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").commit(); 
          } 
          break; 
         default: 
          if(fragmentManager.findFragmentByTag("TAG1") != null){ 
           Log.i("fm", "reloading stats frag"); 
           fragmentManager.beginTransaction().replace(R.id.content_main, 
             fragmentManager.findFragmentByTag("TAG1"), "TAG1"); 
          } else{ 
           fragmentManager.beginTransaction().replace(R.id.content_main, fragments[1], "TAG1").commit(); 
          } 
          break; 
        } 

        drawerLayout.closeDrawers(); 
        return true; 
       } 
      } 
    ); 
} 

現在のコード:私は、ビューの順序を保存するには、それはIDを持たなければならないことが判明

は(意味があります)。また、私は私の前のコード

nav_view.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
        item.setChecked(true); 

        FragmentManager fragmentManager = getSupportFragmentManager(); 
        switch (item.getItemId()) { 
         case R.id.nav_routine: 
           fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").commit(); 
          break; 
         default: 
           fragmentManager.beginTransaction().replace(R.id.content_main, fragments[1], "TAG1").commit(); 
          break; 
        } 

        drawerLayout.closeDrawers(); 
        return true; 
       } 
      } 
    ); 
+0

があなたのEditTextデータを再利用する/保存するためonSaveInstanceState使用

@Override public void onBackPressed() { if (getSupportFragmentManager().getBackStackEntryCount() > 0) getSupportFragmentManager().popBackStack(); else super.onBackPressed(); } 
... –

答えて

0

イムこの.Butあなたの質問では明らかではないに私の.replaceの一部と.commit()を使用していませんでしたがどのように断片のbackStateを保っています。

Fragment mfragment=new Fragmentname();   

     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.fragment_container, mfragment); 
     String backStateName = mfragment.getClass().getName(); 
     if (position != 0) { 
      ft.addToBackStack(backStateName); 
     } 

     ft.commit(); 
0

それから離れるときにFragmentのデータを救うことができると私はあなたがすでにについてSavedInstanceStateを知っていると思います。とにかく、フラグメントトランザクションを使用してActivityから1つのフラグメントを別のフラグメントにトランザクションしている間に、コミットする前にaddToBackStack(null)を追加する必要があります。だから、トランザクションが

fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").addToBackStack(null).commit(); 

のように見て、このようなあなたのActivityonBackPressed機能をオーバーライドする必要があります。

+0

前後にメニューからのフラグメント間を移動するとき、私は意味、私は私が変更何でも維持する必要があります。私は子フラグメント(深いフラグメント)を知っています。私はgetChildFragmentManagerを使用して各メインフラグメントが独自のバックスタックを持つことができます。 – John