我ListView
通过扩展创建了一个自定义AdapterView
,我想在这个视图中处理关键事件。我已经覆盖onKeyDown
了,但从来没有看到它被调用过。我什至尝试过覆盖dispatchKeyEvent
,但也从未被调用过。我还使用setFocusable(true)
.
另外,我对哪个视图实际上确实有焦点感到有些困惑。在 HierarchyView 中,树中的每个视图都表示 hasFocus = false。
如何在我的视图中接收关键事件?
我ListView
通过扩展创建了一个自定义AdapterView
,我想在这个视图中处理关键事件。我已经覆盖onKeyDown
了,但从来没有看到它被调用过。我什至尝试过覆盖dispatchKeyEvent
,但也从未被调用过。我还使用setFocusable(true)
.
另外,我对哪个视图实际上确实有焦点感到有些困惑。在 HierarchyView 中,树中的每个视图都表示 hasFocus = false。
如何在我的视图中接收关键事件?
看起来我可以在这里回答我自己的问题。
看一下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()
。