アイテムごとにフラグメントがあるボトムナビゲーションビューにしようとしています。次のように断片の間で変更するための私のコードは次のとおりです。私はそれを行うと。予想通りに動作していません
@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;
ええ、このメソッドはnullを使用するために使用されるパラメータをとるため、私が戻るボタンを押すと、私が示した最後のフラグメントに私をもたらします...私はドキュメントを見ていました。スタックから取り除くと、addToBackStackが私を助けるとは思っていません。 –