ナビゲーション ドロワーを使用する場合、Android 開発者は、アクション バーで「ナビゲーション ドロワーに表示される画面のみに実際にナビゲーション ドロワーの画像を表示する」ことと、「他のすべての画面には従来の上向きカラットを表示する」ことを推奨しています。
詳細はこちらをご覧ください:http://youtu.be/F5COhlbpIbY
1 つのアクティビティを使用して複数レベルのフラグメントを制御し、ナビゲーション ドロワー イメージをすべてのレベルで表示して機能させることができます。
下位レベルのフラグメントを作成するときに、を呼び出してActionBarDrawerToggle
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, "lowerFrag").addToBackStack(null).commit();
私が抱えている問題は、トップ レベルのフラグメントに戻ると、元のナビゲーション ドロワー イメージではなく、アップ カラットが引き続き表示されることです。トップ レベルのフラグメントの ActionBar を「更新」して、ナビゲーション ドロワー イメージを再表示する方法について、何かアドバイスはありますか?
解決
トムの提案は私にとってはうまくいきました。私がやったことは次のとおりです。
主な活動
このアクティビティは、アプリ内のすべてのフラグメントを制御します。
他のフラグメントを置き換える新しいフラグメントを準備するときは、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
、DrawerToggle をsetDrawerIndicatorEnabled(true)
次のように設定して上記を元に戻しました。
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
LowerLevelFragments内
私が変更したフラグメントはonCreate
次onOptionsItemSelected
のようになります:
オプションメニューの設定を有効にするために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;
…
}
ベストアンサー1
とても簡単です。
以下を達成したい場合:
1)引き出しインジケーター- バックスタックに破片がない場合、または引き出しが開いている場合
2)矢印- フラグメントがバックスタックにある場合
private FragmentManager.OnBackStackChangedListener
mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
syncActionBarArrowState();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(
this,
mDrawerLayout,
R.drawable.ic_navigation_drawer,
0,
0
) {
public void onDrawerClosed(View view) {
syncActionBarArrowState();
}
public void onDrawerOpened(View drawerView) {
mDrawerToggle.setDrawerIndicatorEnabled(true);
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
getSupportFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener);
}
@Override
protected void onDestroy() {
getSupportFragmentManager().removeOnBackStackChangedListener(mOnBackStackChangedListener);
super.onDestroy();
}
private void syncActionBarArrowState() {
int backStackEntryCount =
getSupportFragmentManager().getBackStackEntryCount();
mDrawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}
3) 両方の指標が形状に応じて動作する
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.isDrawerIndicatorEnabled() &&
mDrawerToggle.onOptionsItemSelected(item)) {
return true;
} else if (item.getItemId() == android.R.id.home &&
getSupportFragmentManager().popBackStackImmediate()) {
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
PS参照Android Developers でナビゲーション ドロワーを作成する3 行インジケーターの動作に関するその他のヒント。