1

ListView拡張してカスタムを作成しましたAdapterView。このビュー内で主要なイベントを処理したいと思います。オーバーライドonKeyDownしましたが、呼び出されるのを見たことがありません。私もオーバーライドdispatchKeyEventを試みましたが、それも呼び出されません。また、でビューをフォーカス可能にしましsetFocusable(true)た。

また、実際にどのビューに焦点が当てられているかについて、私は少し混乱しています。HierarchyViewでは、ツリー内のすべてのビューがhasFocus=falseと表示されます。

ビューで主要なイベントを受信するにはどうすればよいですか?

4

1 に答える 1

1

ここで自分の質問に答えられるようです。

を見てAdapterViewみると、次の実装でsetFocusableをオーバーライドしていることがわかります。

 @Override
    public void setFocusable(boolean focusable) {
        final T adapter = getAdapter();
        final boolean empty = adapter == null || adapter.getCount() == 0;

        mDesiredFocusableState = focusable;
        if (!focusable) {
            mDesiredFocusableInTouchModeState = false;
        }

        super.setFocusable(focusable && (!empty || isInFilterMode()));
    }

ここでsuper.setFocusableを最後に呼び出したところからわかるように、アダプターからのデータがまだバインドされていない場合(つまり、アダプターがnullであるか、<= 0である場合)、ビューはフォーカスできません。

したがって、これを解決するには、実装setFocusable(true)の最後に追加するだけです。setAdapter()

于 2013-03-20T19:53:16.423 に答える