我的应用程序有一个ListView和一个位于它下面的EditText.由于某种原因,TAB键不会触发onKeyListener.我正在处理的所有其他键(DEL,ENTER,DPAD_UP / DOWN / CENTER)都很好.我在dispatchKeyEvent中添加了一个断点,再次没有运气接收TAB事件.
我的应用程序以前有一个用于显示文本的大型TextView,在此期间,TAB事件被收到了. ListView现在已经替换了TextView.
我完全不知道为什么不再接收TAB事件.这是一个库存Xoom,运行ICS 4.0.4&股票N1,2.3.6.
我将当前代码与使用TextView的版本进行了比较,而且大部分代码只是为了处理TextView而不是TextView.除了nextFocusLeft和nextFocusRight属性之外,EditText没有其他任何改变.
解决方法
我想我可能会看到这个问题.查看ListView.
java的源代码,有一种机制可以使用在列表项中移动焦点的键事件.查看此方法之前的注释以及方法中间的注释块.
/** * To avoid horizontal focus searches changing the selected item,we * manually focus search within the selected item (as applicable),and * prevent focus from jumping to something within another item. * @param direction one of {View.FOCUS_LEFT,View.FOCUS_RIGHT} * @return Whether this consumes the key event. */ private boolean handleHorizontalFocusWithinListItem(int direction) { if (direction != View.FOCUS_LEFT && direction != View.FOCUS_RIGHT) { throw new IllegalArgumentException("direction must be one of" + " {View.FOCUS_LEFT,View.FOCUS_RIGHT}"); } final int numChildren = getChildCount(); if (mItemsCanFocus && numChildren > 0 && mSelectedPosition != INVALID_POSITION) { final View selectedView = getSelectedView(); if (selectedView != null && selectedView.hasFocus() && selectedView instanceof ViewGroup) { final View currentFocus = selectedView.findFocus(); final View nextFocus = FocusFinder.getInstance().findNextFocus( (ViewGroup) selectedView,currentFocus,direction); if (nextFocus != null) { // do the math to get interesting rect in next focus' coordinates currentFocus.getFocusedRect(mTempRect); offsetDescendantRectToMyCoords(currentFocus,mTempRect); offsetRectIntoDescendantCoords(nextFocus,mTempRect); if (nextFocus.requestFocus(direction,mTempRect)) { return true; } } // we are blocking the key from being handled (by returning true) // if the global result is going to be some other view within this // list. this is to acheive the overall goal of having // horizontal d-pad navigation remain in the current item. final View globalNextFocus = FocusFinder.getInstance().findNextFocus( (ViewGroup) getRootView(),direction); if (globalNextFocus != null) { return isViewAncestorOf(globalNextFocus,this); } } } return false; }
单个列表元素中是否有多个可聚焦项目?如果是这样,此代码将使用Tab键.如果是这种情况,那么您可能想要使一些项目不可聚焦或考虑另一种设计选项.