5

私の現在のアプリは、D-Pad リモコンを使用して制御する必要があります。

フォーカス/選択を使用すると、最近隣の自動計算は期待どおりに機能しますが、上、下、左、右の移動を、フォーカスされたビューを含む現在のフラグメントでのみ発生するように制限し、移動する前にフォーカスの変更をキャンセルしたい別のフラグメント。

ビューを選択すると、プログラムでフォーカスを新しいフラグメントに変更しています。

これは可能ですか?onFocusChange() イベントを使用すると、新しいフォーカスがフラグメントの外側にあるかどうかを確認して戻ることができると想定できますが、ここではうまくいきません...

4

1 に答える 1

3

つまり、フラグメントを保持するコンテナを呼び出しsetDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)て、すべてのフラグメントの子孫のフォーカス可能性をブロックできます。フォーカス可能性を戻すには、呼び出すことができますsetDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS)

詳細:

FrameLayout2 つのフラグメントが重なっていて、フォーカス ナビゲーションを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 でポップするときにも、フォーカス可能性の設定を変更できます。

于 2015-09-30T12:03:04.777 に答える