7

我的应用程序下面有一个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。

我已经将我当前的代码与使用 a 的版本进行了比较,TextView并且大部分代码只是为了处理ListView. TextView除了nextFocusLeftnextFocusRight属性之外,EditText 没有其他任何变化。

编辑:我刚刚尝试使用 Go Keyboard 和 Hacker's Keyboard,TAB 收到了很好的效果。看来这只是一些虚拟键盘

4

1 回答 1

0

我想我可能会看到问题所在。查看 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(), currentFocus, direction);
            if (globalNextFocus != null) {
                return isViewAncestorOf(globalNextFocus, this);
            }
        }
    }
    return false;
}

单个列表元素中是否有多个可聚焦的项目?如果是这样,此代码将使用 tab 键。如果是这种情况,那么您可能希望使某些项目无法聚焦或考虑其他设计选项。

于 2012-05-23T03:05:58.693 回答