[解決済み] フラグメント使用時のAndroid Navigation Drawerの画像とUpキャレットの切り替えについて
質問
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の中で
私が修正したフラグメントでは
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;
…
}
解決方法は?
下位のフラグメントを実装するために、新しいアクティビティで下位のフラグメントを実装するのではなく、既存のフラグメントを置き換えると書いていますね。
その場合、バック機能を手動で実装する必要があると思います。ユーザーがバックを押したときに、スタックをポップするコード(例.
Activity::onBackPressed
をオーバーライドする)。 ですから、どこでそれをやっても、逆に
setDrawerIndicatorEnabled
.
関連
-
Androidのadbデバイスがオフラインであることが判明
-
[解決済み] Androidのgravityとlayout_gravityの違いは何ですか?
-
AndroidエミュレーターのADBサーバーがACKしない問題
-
例外「指定された子にはすでに親がいます」の解決方法。removeViewを呼び出す必要があります" の解決方法(ソースコード付き例)
-
android exception - aapt.exe has stopped working.
-
Windowsのadbシェルでデータディレクトリにアクセスするとパーミッションが拒否される
-
Android TextViewにandroid:ellipsize=endのバグがある。
-
AndroidでListViewを使ってカスタムテーブルを描画する
-
android bluetooth--Bluetooth on、検索、ペアリング、接続
-
[解決済み] なぜフラグメントなのか、そしてアクティビティの代わりにフラグメントを使用するのはどんなときか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Android Studio を 3.6.3 にアップデートした後、構成 :classpath のアーティファクトをすべて解決できない。
-
JVMのエラーに遭遇しました。Java Runtime Environmentによって致命的なエラーが検出されました。
-
ライブラリをモジュールとしてインポートする際にエラーが発生しました。Error:A problem occurred configuring project ':library'.
-
Android Nで報告されたエラーを解決する: android.os.FileUriExposedException: file:///storage/emulated/0/
-
repo: コマンドが見つかりません
-
view.getRootView()の本当の意味とテストについて
-
Androidのカラーグラデーション実装のまとめ
-
超シンプルなアンドロイドのタイムディレイ機能
-
AndroidStudioのショートカット 検索/置換
-
Android TextViewは、テキスト内容が表示省略記号を超えているかどうかを判断する