7

私のアプリにはListViewと そのEditText下に座っています。何らかの理由で、TAB キーがトリガーされませんonKeyListener。私が扱っている他のすべてのキー (DEL、ENTER、DPAD_UP/DOWN/CENTER) は問題なく受信されます。にブレークポイントを追加しましたがdispatchKeyEvent、TAB イベントを受信できませんでした。

私のアプリは以前、TextViewテキストを表示するために大きなサイズを持っていましたが、この間、TAB イベントは正常に受信されました。がにListView置き換わりましたTextView

TAB イベントが受信されなくなった理由について、私は完全に困惑しています。これは、2.3.6 で ICS 4.0.4 とストック N1 を実行しているストック Xoom にあります。

現在のコードを を使用したバージョンと比較しましたが、コードの多くはの代わりにTextViewを処理するだけです。および属性を除いて、EditText については何も変更されていません。ListViewTextViewnextFocusLeftnextFocusRight

編集: 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;
}

1つのリスト要素内に複数のフォーカス可能なアイテムがありますか?その場合、このコードはタブキーを消費します。その場合は、一部のアイテムの焦点を絞らないようにするか、別のデザインオプションを検討することをお勧めします。

于 2012-05-23T03:05:58.693 に答える