フラグメントを使用して Android に NavigationView を実装しました。フラグメントを扱うのはこれが初めてです。問題は、NavigationView に 3 つの項目があり、次のようなことをしたいことです。
- ユーザーがホーム画面に入り、デフォルトで「トップ 20 フラグメント」が選択されます (この時点で戻るキーを押すとアプリが終了します) - トランザクションをバックスタックにプルせずに、このフラグメントをデフォルトとして設定しています。
private void setStartingFragment(NavigationView navigationView,
FragmentManager fragmentManager) {
Fragment fragment = null;
Class fragmentClass = Top20RecipesFragment.class;
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frame_layout_content, fragment);
fragmentTransaction.commit();
MenuItem menuItem = navigationView.getMenu().getItem(0);
menuItem.setChecked(true); // Highlight The Selected Item
setTitle(menuItem.getTitle()); // Updating Toolbar Title
}
他の 2 つのフラグメントの 1 つを選択すると、それらをバック スタックに追加したいと思います。Twitchモバイルアプリケーションのようにこれをやりたいです。可能性は次のとおりです。
- 2 番目のフラグメント (または 3 番目) -> ホーム フラグメント -> 終了 または
- 2 番目のフラグメント -> 3 番目のフラグメント -> ホーム フラグメント -> 終了 または
- 2 番目のフラグメント -> 3 番目のフラグメント -> ホーム フラグメント -> 終了 または
もう 1 つの大きな問題は、NavigationView で選択した項目と Tooblar のタイトルを [戻る] ボタンを押して同期することです。
NavigationView とフラグメントの置き換えについて話す場合、ここに私が今持っているものがあります:
// Replace Existing Fragment With a New One
public void selectDrawerItem(MenuItem menuItem) {
Fragment fragment = null;
Class fragmentClass = null;
switch(menuItem.getItemId()) {
case R.id.nav_top20_recipes: {
fragmentClass = Top20RecipesFragment.class;
break;
}
case R.id.nav_kitchen_type: {
fragmentClass = KitchenTypeFragment.class;
break;
}
case R.id.nav_meal_type: {
fragmentClass = MealTypeFragment.class;
break;
}
}
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frame_layout_content, fragment);
fragmentTransaction.addToBackStack(Integer.toString(fragment.getId()));
fragmentTransaction.commit();
menuItem.setChecked(true); // Highlight The Selected Item
setTitle(menuItem.getTitle()); // Updating Toolbar Title
mDrawerLayout.closeDrawers(); // Close The Drawer
}
Android公式サイトを調べたところ、 OnBackStackChangedListener を使用して、フラグメントの置換と戻るボタンの使用に応じてアクティビティの外観を変更するようアドバイスされています。
このインターフェイスを適用しようとしましたが、ここではさまざまなチュートリアルでやろうとしましたが、アプリがクラッシュするか、正しく動作しません。
// Managing Fragments In Back Stack
@Override
public void onBackStackChanged() {
int actualStackHeight = getSupportFragmentManager().getBackStackEntryCount();
if (actualStackHeight > 0) {
FragmentManager fragmentManager = getSupportFragmentManager();
int fragmentId = fragmentManager.getBackStackEntryAt(actualStackHeight - 1).getId();
Fragment currentFragment = fragmentManager.findFragmentById(fragmentId);
switch (currentFragment.getId()) {
case R.id.top20_fragment: {
MenuItem menuItem = nvDrawer.getMenu().getItem(0);
menuItem.setChecked(true); // Highlight The Selected Item
setTitle(menuItem.getTitle()); // Updating Toolbar Title
}
case R.id.kitchen_type_fragment: {
MenuItem menuItem = nvDrawer.getMenu().getItem(1);
menuItem.setChecked(true); // Highlight The Selected Item
setTitle(menuItem.getTitle()); // Updating Toolbar Title
}
case R.id.meal_type_fragment: {
MenuItem menuItem = nvDrawer.getMenu().getItem(2);
menuItem.setChecked(true); // Highlight The Selected Item
setTitle(menuItem.getTitle()); // Updating Toolbar Title
}
}
} else {
finish();
}
}
このようなことを扱うのはこれが初めてなので、私を理解してください。ここでもスタックでさまざまなアンサーを検索しましたが、どれも役に立ちませんでした:/