つまり、フラグメントを保持するコンテナを呼び出しsetDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)
て、すべてのフラグメントの子孫のフォーカス可能性をブロックできます。フォーカス可能性を戻すには、呼び出すことができますsetDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS)
詳細:
FrameLayout
2 つのフラグメントが重なっていて、フォーカス ナビゲーションをtop_fragment
配置されている場合とback_fragment
そうでない場合に制限したいとします。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/back_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<FrameLayout
android:id="@+id/top_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
addOnBackStackChangedListener()
のインスタンスを最初に呼び出してFragmentManager
、バックスタック リスナーを提供します。メソッド を使用してフォーカス可能性を制御するコードを記述できますsetDescendantFocusability
。を使用getFragmentManager().findFragmentBy*
して、現在使用されているフラグメント、一番上にあるものなどを見つけ、子孫のフォーカス可能性フラグを適切に設定できます。コンテナを入れ替える場合はメソッドtop_fragment
でバックスタックにトランザクションを追加しaddToBackStack()
ます。そうすれば、バックスタックが変更されたときに、フラグメントを追加するときだけでなく、BACK でポップするときにも、フォーカス可能性の設定を変更できます。