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 回答