1. ホーム
  2. android

[解決済み] フラグメント使用時のAndroid Navigation Drawerの画像とUpキャレットの切り替えについて

2022-04-21 17:16:49

質問

Navigation Drawerを使用する場合、Android開発者はActionBarで"Navigation Drawerで表現されている画面だけが実際にNavigation Drawerの画像を持つべきで"他のすべての画面は従来のアップカラットを持つことを推奨しています".Navigation Drawerを使用する場合、Android開発者はそのような画面を持つことを推奨しています。

詳しくはこちらをご覧ください。 http://youtu.be/F5COhlbpIbY

1つのアクティビティで複数のレベルのフラグメントを制御していますが、すべてのレベルでNavigation Drawerの画像を表示し、機能させることができます。

下位のフラグメントを作成する際に ActionBarDrawerToggle setDrawerIndicatorEnabled(false) ナビゲーションドロワー画像を非表示にして、Upキャレットを表示させるために

LowerLevelFragment lowFrag = new LowerLevelFragment();

//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout, 
lowFrag, "lowerFrag").addToBackStack(null).commit();

問題は、トップレベルのフラグメントに戻ったときに、元のナビゲーションドロワー画像ではなく、アップカラットが表示されたままになっていることです。トップレベルのフラグメントのActionBarを更新して、Navigation Drawerの画像を再表示する方法について、何かご提案があれば教えてください。


解決方法

トムさんの提案は、私にとってうまくいきました。 以下は私が行ったことです。

メインアクティビティ

このアクティビティは、アプリ内のすべてのフラグメントを制御します。

他のフラグメントを置き換えるために新しいフラグメントを用意するとき、私はDrawerToggle setDrawerIndicatorEnabled(false) このように

LowerLevelFragment lowFrag = new LowerLevelFragment();

//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,   
lowFrag).addToBackStack(null).commit();

次に、オーバーライドで onBackPressed を設定することで、上記を元に戻しました。 setDrawerIndicatorEnabled(true) このように

@Override
public void onBackPressed() {
    super.onBackPressed();
    // turn on the Navigation Drawer image; 
    // this is called in the LowerLevelFragments
    setDrawerIndicatorEnabled(true)
}


LowerLevelFragmentsの中で

私が修正したフラグメントでは onCreateonOptionsItemSelected このように

onCreate を追加しました。 setHasOptionsMenu(true) を追加し、オプションメニューの設定を可能にしました。また setDisplayHomeAsUpEnabled(true) を有効にするために <です。 をアクションバーで表示します。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // needed to indicate that the fragment would 
    // like to add items to the Options Menu        
    setHasOptionsMenu(true);    
    // update the actionbar to show the up carat/affordance 
    getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}

次に onOptionsItemSelected を実行するたびに <です。 が押されると onBackPressed() のアクティビティから、階層を1つ上に移動して、ナビゲーションドロワー画像を表示します。

@Override
public boolean onOptionsItemSelected(MenuItem item) {   
    // Get item selected and deal with it
    switch (item.getItemId()) {
        case android.R.id.home:
            //called when the up affordance/carat in actionbar is pressed
            getActivity().onBackPressed();
            return true;
        … 
    }

解決方法は?

下位のフラグメントを実装するために、新しいアクティビティで下位のフラグメントを実装するのではなく、既存のフラグメントを置き換えると書いていますね。

その場合、バック機能を手動で実装する必要があると思います。ユーザーがバックを押したときに、スタックをポップするコード(例. Activity::onBackPressed をオーバーライドする)。 ですから、どこでそれをやっても、逆に setDrawerIndicatorEnabled .