2日前のエントリで扱ったFlex2のフォーカス移動順問題は、翌日の朝にあっさり解決しました。
ヒントはフォーカスを得ることができるコンポーネントが実装すべき IFocusManagerComponent のドキュメントではなく、それを実装している InteractiveObject のドキュメントにありました。
「2 つのオブジェクトの tabIndex が同じ値である場合、デフォルトのタブ順序が優先するオブジェクトが他のオブジェクトよりも優先されます。」
図の例では上からボタンA、ボタンBとCを含むカスタムコンポーネント、ボタンCの3つのコンポーネントが配置され、上から順に tabIndex が 1、2、3 とセットされています。先日の状態ではカスタムコンポーネント内のボタンに tabIndex が設定されないため、フォーカスの移動順がA、D、B、Cとなっていました。
これを解決するには、ボタンB、Cに適切に tabIndex を設定すれば良いはずです。そして同じ tabIndex を付けることが許されて、そのときはデフォルトの移動順になるということが分かりました。
ならば、ボタンB、Cの tabIndex を、カスタムコンポーネントに指定された tabIndex と同じ値にすればOK。最も単純な方法なら、tabIndex のセッターと childlenCreated をオーバーライドして、各ボタンの tabIndex に値を代入。
そして実行、ちゃんと動いた、問題なし。
補足:デフォルトのタブ順序はコンポーネントの z 順序(重ね順)で決まります。
ヒントはフォーカスを得ることができるコンポーネントが実装すべき IFocusManagerComponent のドキュメントではなく、それを実装している InteractiveObject のドキュメントにありました。
「2 つのオブジェクトの tabIndex が同じ値である場合、デフォルトのタブ順序が優先するオブジェクトが他のオブジェクトよりも優先されます。」
図の例では上からボタンA、ボタンBとCを含むカスタムコンポーネント、ボタンCの3つのコンポーネントが配置され、上から順に tabIndex が 1、2、3 とセットされています。先日の状態ではカスタムコンポーネント内のボタンに tabIndex が設定されないため、フォーカスの移動順がA、D、B、Cとなっていました。
これを解決するには、ボタンB、Cに適切に tabIndex を設定すれば良いはずです。そして同じ tabIndex を付けることが許されて、そのときはデフォルトの移動順になるということが分かりました。
ならば、ボタンB、Cの tabIndex を、カスタムコンポーネントに指定された tabIndex と同じ値にすればOK。最も単純な方法なら、tabIndex のセッターと childlenCreated をオーバーライドして、各ボタンの tabIndex に値を代入。
そして実行、ちゃんと動いた、問題なし。
補足:デフォルトのタブ順序はコンポーネントの z 順序(重ね順)で決まります。