2017-10-26 14 views
0

アイテムごとにフラグメントがあるボトムナビゲーションビューにしようとしています。次のように断片の間で変更するための私のコードは次のとおりです。私はそれを行うと。予想通りに動作していません

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_host, container, false); 

    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); 
    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); 

    fm = getActivity().getSupportFragmentManager(); 
    final BottomNavigationView bottomNavigationView = (BottomNavigationView) 
      view.findViewById(R.id.navigation); 
    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      Fragment selectedFragment; 
      FragmentTransaction transaction = fm.beginTransaction(); 
      switch (item.getItemId()){ 
       case R.id.countries_bottom: 
        selectedFragment = fm.findFragmentByTag(COUNTRIES_TAG); 
        // If fragment doesn't exist yet, create one 
        if (selectedFragment == null) { 
         transaction.add(R.id.frame_layout, new CountriesFragment(), COUNTRIES_TAG); 
         Log.d("FRAGMENTS", "COUNTRIES CREATED"); 
        } 
        else { // re-use the old fragment 
         transaction.replace(R.id.frame_layout, selectedFragment, COUNTRIES_TAG); 
         Log.d("FRAGMENTS", "COUNTRIES REPLACED"); 
        } 
        break; 
       case R.id.cities_bottom: 
        selectedFragment = fm.findFragmentByTag(CITIES_TAG); 
        // If fragment doesn't exist yet, create one 
        if (selectedFragment == null) { 
         transaction.add(R.id.frame_layout, new CitiesFragment(), CITIES_TAG); 
         Log.d("FRAGMENTS", "CITIES CREATED"); 
        } 
        else { // re-use the old fragment 
         transaction.replace(R.id.frame_layout, selectedFragment, CITIES_TAG); 
         Log.d("FRAGMENTS", "CITIES REPLACED"); 
        } 
        break; 
       case R.id.places_bottom: 
        selectedFragment = fm.findFragmentByTag(PLACES_TAG); 
        // If fragment doesn't exist yet, create one 
        if (selectedFragment == null) { 
         transaction.add(R.id.frame_layout, new PlacesFragment(), PLACES_TAG); 
         Log.d("FRAGMENTS", "PLACES CREATED"); 
        } 
        else { // re-use the old fragment 
         transaction.replace(R.id.frame_layout, selectedFragment, PLACES_TAG); 
         Log.d("FRAGMENTS", "PLACES REPLACED"); 
        } 
        break; 
      } 
      transaction.commit(); 
      return true; 
     } 
    }); 

    return view; 
} 

、彼らが実行するのですが、それは時々奇妙です。私は1、2、3と呼ぶことができます。私が1に入って2に行くと、ログは "CREATED"と表示され、2が作成されますが、1はまだ裏に見えます。その後、1に戻ると、「置き換えられました」と表示され、正常に表示されます。しかし、私は2つに戻って、「置き換えられました」と言うのではなく、「作成されました」と言っていますので、どのように置き換えが行われているのか分かりません。どうすればいいですか?断片?

1から2へ、3へ行くと、1に戻ると、1は「置換」されずに「作成」されます。

EDIT:置換は私のフラグメントを完全にスタックから削除することを知っていたので、置き換える代わりにフラグメントを表示し、存在する場合は残りを隠すことにしました。これは問題を解決し、アプリは基本的に私が探していることを実行しますが、私はこれが最善の解決策ではないと確信しています。ここで

は、私がやった迅速な変化の例である:

case R.id.countries_bottom: 
        selectedFragment = fm.findFragmentByTag(COUNTRIES_TAG); 
        // If fragment doesn't exist yet, create one 
        if (selectedFragment == null) { 
         transaction.add(R.id.frame_layout, new CountriesFragment(), COUNTRIES_TAG); 
         Log.d("FRAGMENTS", "COUNTRIES CREATED"); 
        } 
        else { // re-use the old fragment 
         transaction.show(selectedFragment); 
         Log.d("FRAGMENTS", "COUNTRIES REPLACED"); 
        } 
        if(fm.findFragmentByTag(CITIES_TAG) != null) 
         transaction.hide(fm.findFragmentByTag(CITIES_TAG)); 
        if(fm.findFragmentByTag(PLACES_TAG) != null) 
         transaction.hide(fm.findFragmentByTag(PLACES_TAG)); 
        transaction.commit(); 
        break; 

答えて

0

が、その後、私は戻って2に再移動して、代わりにそれが再び「CREATED」と言い、「REPLACED」と言って。

私は100%確信していませんが、これは、フラグメント1に戻ると、フラグメント2がバックスタックから削除され、もはや存在しないためです。

私が1から2へ、3へ行くと、1に戻ると、1は「置換」されずに、再び「作成」されます。

// Works with either the framework FragmentManager or the 
// support package FragmentManager (getSupportFragmentManager). 
getSupportFragmentManager().beginTransaction() 
          .add(detailFragment, "detail") 
          // Add this transaction to the back stack 
          .addToBackStack() 
          .commit(); 

あなたが見ることができるように、.addToBackStack()メソッドがあります。私はフラグメントを追加するときこのメソッドを使用することをお勧めします。

このコードはドキュメントから削除されました:私は何かのお手伝いを持っていた https://developer.android.com/training/implementing-navigation/temporal.html

希望。

+0

ええ、このメソッドはnullを使用するために使用されるパラメータをとるため、私が戻るボタンを押すと、私が示した最後のフラグメントに私をもたらします...私はドキュメントを見ていました。スタックから取り除くと、addToBackStackが私を助けるとは思っていません。 –

関連する問題