Flex でフォーカスがどのように機能するかを掘り下げる必要があります。これは完全な答えではありませんが、うまくいけば、あなたに合った解決策をまとめることができます. Flex 3 で約 4 ~ 5 年前にこれを行いましたが、Flex 4 でも同様のはずです。
Flex でのフォーカスの仕組み
主に知っておくべきことは、FocusManagerシングルトン クラスとIFocusManagerComponentインターフェイスです。
FocusManager
ユーザー インタラクション (マウス クリック、キーボード ナビゲーションなど) に基づいて、UI 内でフォーカスを移動します。
IFocusManagerComponent
コンポーネントがインターフェイスを実装する場合、FocusManager
はそれを「タブ」ループに含め、キーボード ナビゲーションを介してコンポーネントにフォーカスできるようにします。
フォーカスがフレックス リスト コンポーネントでどのように機能するか
List
フォーカスがコンポーネントとアイテムのレンダラーでどのように機能するかの特異性にすでに遭遇しました。FlexList
コンポーネントが実装されIFocusMangerComponent
ているため、UI をタブで移動するとFocusManager
、フォーカスがリストに送信されます。
アイテムレンダラーにフォーカスするList
場合とフォーカスしない場合があります。Flex 3 では、これを行うために編集可能なアイテム レンダラーを使用する必要がありましたが、Flex 4 では同じである場合とそうでない場合があります。
問題を解決するためのアイデア
これを解決する方法はたくさんあると思います。これらの手法をいくつか組み合わせて使用します。
List コンポーネントの保護されたkeyDownHandler()メソッドをオーバーライドします。コードは手元にありませんが、List
クラスの実装を見ると、オーバーライドされたバージョンが次のレンダラーにフォーカスを設定できるようになるはずです。
タブ ループ内のコンポーネントを検索するには、FocusManager のメソッドを使用します: getNextFocusManagerComponent()、findFocusManagerComponent()。ドキュメントを確認してください。他にも役立つものがあります。たとえば、ユーザーが下矢印を押したときに、次のアイテム レンダラーが選択されるようにfindFocusManagerComponent()
し、(新しく選択されたレンダラーを渡す) を使用FocusManager
して、メソッドでそれにフォーカスするように指示することができsetFocus()
ます。これはおそらく正しいアプローチではありません;)
ちなみに、これFocusManger
は Flex のシングルトン オブジェクトであり、Flex のすべてUIComponent
のオブジェクトには、参照を取得するために使用できるfocusManagerプロパティがあります。
フォーカスを受け取る必要のないオブジェクト (Label
アイテム レンダラーなど) のフォーカスを無効にすることを検討してください。focusEnabled
これを行うには、hasFocusableChildren
、mouseFocusEnabled
、tabEnabled
、tabChildren
などの多数のプロパティがあります。
コンポーネントへのフォーカスを無効にすることを検討しList
てください。ただし、アイテム レンダラーにIFocusManagerComponent
インターフェースを実装させることを検討してください。インターフェイスの実装は簡単です。クラスで宣言するだけです (実装する実際のメソッドはありません)。トリッキーな部分は、アイテムレンダラーにキーダウンハンドラーが必要になることです (keyDownHandler()
すべてのUIComponent
オブジェクトが持っている保護されたメソッドをオーバーライドするだけです)。
他にも使用できるテクニックがあると思います。これを行ってから時間が経ちました。行き詰まった場合は、さらにサポートを提供できることをうれしく思います...