2017-06-08 1 views
1

私のフラグメントトランザクションのこの動作を理解できません。誰かが私が狂って行く前に介入してもらえますか?私のMainActivityでは、私はそれを正しくセットアップ:Tab1を(ガイド)TAB2(マップ)TAB3(詳細):Androidフラグメントトランザクションで怒っている

private final GuideFragment guideFragment = new GuideFragment(); 
    private final MapFragment mapFragment = new MapFragment(); 
    private final MoreFragment moreFragment = new MoreFragment(); 

    Fragment active; 

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener 
       = new BottomNavigationView.OnNavigationItemSelectedListener() { 

      @Override 
      public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
       FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
       switch (item.getItemId()) { 
        case R.id.navigation_guide: 
         if (!guideFragment.isAdded()) { 
          transaction.add(R.id.content,guideFragment).commit(); 
          active = guideFragment; 
          Log.d(TAG, "add Fragment1"); 
          break; 
         } else { 
          transaction.hide(active).show(guideFragment).commit(); 
          active = guideFragment; 
          Log.d(TAG, "show Fragment1"); 
          break; 
         } 
        case R.id.navigation_map: 
         if (!mapFragment.isAdded()) { 
          transaction.add(R.id.content, mapFragment).commit(); 
          active = mapFragment; 
          Log.d(TAG,"add Fragment2"); 
          break; 
         } else { 
          transaction.hide(active).show(mapFragment).commit(); 
          active = mapFragment; 
          Log.d(TAG,"show Fragment2"); 
          break; 
         } 
        case R.id.navigation_more: 
         if (!moreFragment.isAdded()) { 
          transaction.add(R.id.content,moreFragment).commit(); 
          active = moreFragment; 
          Log.d(TAG,"add Fragment3"); 
          break; 
         } else { 
          transaction.hide(active).show(moreFragment).commit(); 
          active = moreFragment; 
          Log.d(TAG,"show Fragment3"); 
          break; 
         } 
       } 

       return true; 
      } 

     }; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_start); 

     //start with guide view/fragment 
     switchTabView(R.id.navigation_guide); 

    } 

    //method to start or switch a tab 
    private void switchTabView(int itemId) { 
     navigation = (BottomNavigationView) findViewById(R.id.navigation); 
     navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); 
     navigation.setSelectedItemId(itemId); 

    } 

私のアプリは、あなたが上見ることができるように3つのタブがあります。

アプリが起動すると、最初のタブ(ガイド)が正しく追加されて表示されます。 次にMap(次のFragment)をタップします。これが正しく追加されて表示されます。 最後に「もっと見る」タブ(私の3番目のタブ)は素晴らしい作品です。

しかし、アクティビティが起動し、私は1-3をタップすると、これまでに正しい(マップするガイド) - (タブをマッピングするためにもっとタブ) その後、3-2すべての良い - しかし、当時2-1から (地図ガイドへの)ガイド断片があるはずの3番目のタブ断片(More)が突然表示されます。

誰かが間違っていることを知っていますか? 助けていただければ幸いです。 2回のフラグメントを隠す呼び出す場合マテウス

transaction.hide(fragment3).hide(fragment2).show(fragment1).commit(); 

ソリューションのおかげで、私はきれいなことであるかわからないが、私は3つのタブで、それはまだ大丈夫だと思います。より多くのタブでは、これをremove()やreplace()のようなやり方で処理することを検討します。

アップデート - 予想通りのソリューションは、よりトリッキーです:最後に

  switch (item.getItemId()) { 
       case R.id.navigation_guide: 
        if (!guideFragment.isAdded()) { 
         transaction.add(R.id.content,guideFragment).commit(); 
         Log.d(TAG, "add Fragment1"); 
         break; 
        } else { 
         if (!moreFragment.isAdded() && mapFragment.isAdded()) { 
          transaction.hide(mapFragment).show(guideFragment).commit(); 
         } 
         if (moreFragment.isAdded() && !mapFragment.isAdded()) { 
          transaction.hide(moreFragment).show(guideFragment).commit(); 
         } 
         if (moreFragment.isAdded() && mapFragment.isAdded()) { 
          transaction.hide(moreFragment).hide(mapFragment).show(guideFragment).commit(); 
         } 

         Log.d(TAG, "show Fragment1"); 
         break; 
        } 
       case R.id.navigation_map: 
        if (!mapFragment.isAdded()) { 
         transaction.add(R.id.content, mapFragment).commit(); 
         Log.d(TAG,"add Fragment2"); 
         break; 
        } else { 
         if (!moreFragment.isAdded()) { 
          transaction.hide(guideFragment).show(mapFragment).commit(); 
         } else { 
          transaction.hide(guideFragment).hide(moreFragment).show(mapFragment).commit(); 
         } 
         Log.d(TAG,"show Fragment2"); 
         break; 
        } 
       case R.id.navigation_more: 
        if (!moreFragment.isAdded()) { 
         transaction.add(R.id.content,moreFragment).commit(); 
         Log.d(TAG,"add Fragment3"); 
         break; 
        } else { 
         if (!mapFragment.isAdded()) { 
          transaction.hide(guideFragment).show(moreFragment).commit(); 
         } else { 
          transaction.hide(guideFragment).hide(mapFragment).show(moreFragment).commit(); 
         } 
         Log.d(TAG,"show Fragment3"); 
         break; 
        } 
      } 

バグ無料、あなたは他のフラグメントが追加されているかどうかを確認する必要があります!あなたが戻って2から1へ行く時点では、この行が呼び出されます

答えて

3

transaction.hide(active).show(guideFragment).commit(); 

問題は、あなたが(フラグメント2)アクティブ非表示にし、フラグメント1を表示する場合ということで、断片3(ました断片1の後に追加され、したがって断片1の「上にある」)がまだ示されている。フラグメント3を表示するには、フラグメント3を非表示にする必要があります。

つまり、特定のフラグメントを表示するたびに、他のフラグメントをすべて非表示にするようにコードを調整する必要があります。

また、表示/非表示と追加/削除/置き換えのどちらかを選択して、最初の戦略がニーズに合っていることを確認することもできます。this discussion

+0

いくつかのコードを見たいと思っている人のために、私はresovlingコードスニペットで質問を更新しました。 –

1

私はこれを使用するのと同じ活動に別のフラグメントに行きたい:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

transaction.replace(R.id.container,yourFragment); 
transaction.commit(); 

コンテナがあなたの活動のレイアウトです。フラグメントを表示するために使用します。 bottomNavigationViewFragmentTransactionオブジェクトの各ケースでinitを実行する必要があります。

私はこれがあなたが探しているものだと信じています!

+0

これが私の最初のアプローチでした。しかし、このコードでreplace()は常にフラグメントonCreateView-methodを呼び出します。私はwebviewsを得て、私はソースをリロードしたくないので、私の場合hide/showははるかに効果的です。 –

+0

@all others - あなたがフラグメントのonCreateViewメソッドを呼びたい場合(しばしば意味をなす)、世界で最も簡単なものを置き換えるだけです。 –

+0

はい、それは当てはまりますが、単純なフラグメント(たとえば、いくつかのボタン、textViewsなど)では、replace()メソッドを使うのが最も簡単で安全なメソッドです。 –

関連する問題