你能在XML布局中设置“tab order”吗?

62

我有一些使用带有标签键的软键盘的平板电脑用户。我正在使用表视图,在一行中有3个EditText字段,并在当前行下方有EditText字段。

当用户按Tab键时,它会将他们带到下面的下一个字段,而不是右侧的下一个字段。

在布局中是否有设置选项卡顺序的方法,或者仅通过编程实现?

如果只能在Java中完成,具体应该如何操作?

感谢关于NextFocusRight的提示,但它似乎没有起作用(或者我做错了什么)

这是我使用的代码。我必须添加imeoptions才能在模拟器中显示“下一个”按钮。您是否看出我做错了什么?

<EditText 
    android:id="@+id/bikeHHT"
    android:layout_width="50dip"
    android:layout_height="40dip"
    android:textSize="14px"
    android:maxLength="2"
    android:nextFocusLeft="@+id/bikeMMT"
    android:imeOptions="actionNext"
    android:layout_column="1"/>

<EditText 
    android:id="@+id/bikeMMT"
    android:layout_width="50dip"
    android:layout_height="40dip"
    android:textSize="14px"
    android:nextFocusRight="@+id/bikeSST"
    android:imeOptions="actionNext"
    android:maxLength="2"/>
7个回答

102

android:nextFocusLeft 替换为 android:nextFocusDown。"下一个" 软按钮或 TAB 键正在查找下一个 "向下" 的焦点,而不是左侧或右侧。


1
谢谢,就这些了!非常感谢。 - dalesit
2
那么 nextFocusLeft 和 -Right 什么时候被使用/调用? - poitroae
我想它们是由左/右方向键调用的。 - Cheezmeister
左和右似乎只在RelativeLayout内起作用,否则焦点方向不明确,而LinearLayout无论方向如何都只有一个方向。 - G_V
乍一看,似乎nextFocusForward是下一个软按钮的位置。令人惊讶的是,它实际上是nextFocusDown。 - vlazzle

38

我还注意到你参考的内容:

android:nextFocusRight="@+id/bikeSST"

如果您尚未定义该ID,或者引用的元素在.xml文件中较低,则需要使用“+”字符。

否则,如果它已在上面(或已包含),则可以省略“+”字符:

android:nextFocusRight="@id/bikeSST"
不使用"+"引用已经存在的ID的一个优点是,IDE和Lint检查可以检测到错误的情况:即您正在引用实际上不存在的ID。
如果包含"+",则会在不存在时创建它,这个检查将无法执行。

1
所以我猜@+id在这种情况下的使用有点像前向声明。不管怎样,在LinearLayout中使用nextFocusRight似乎只有使用+id的方式。 - trooper
@trooper 是的,我也是这样想的。它允许您在文件的解析顺序中声明引用之前使用它。 - Andrew Mackenzie

12

对于我来说,android:nextFocusUpandroid:nextFocusRightandroid:nextFocusDownandroid:nextFocusLeft都没有起作用,但android:nextFocusForward可以工作。

请参考支持键盘导航,处理选项卡导航


10

你是否检查了EditText的android:imeOptions="actionNext"属性?

它会将虚拟键盘中回车键的名称替换为“下一个”,并且点击它时,焦点会跳转到下一个字段。

在你的布局中,你可以这样做:

<EditText
    ...
    android:text="Field 1"
    android:imeOptions="actionNext" />
<EditText
    ...
    android:text="Field 2"
    android:imeOptions="actionNext" />

而在Java中

TextView field2 = (TextView) field1.focusSearch(View.FOCUS_RIGHT);
field2.requestFocus();

由您决定下一个请求焦点的字段。


谢谢,如果我无法使NextFocusRight工作,我将不得不使用这个方法,但似乎必须添加代码才能修复选项卡顺序,这有点麻烦。 - dalesit

4

有更好的方法。您可以在布局中放置一个XML参数,当用户完成每个EditText时,它会自动将光标移动到下一个EditText,这样可以更轻松地实现表单。

问题是,该死的生命记得它是什么...

请务必查看android:nextFocus* xml属性。普通表单操作是向下移动。但也许有一个按钮在右边,您希望接收下一个焦点(类似于按Enter或类似操作)。

http://developer.android.com/reference/android/view/View.html#attr_android:nextFocusDown

还有一些编程选项可用:

http://developer.android.com/reference/android/view/View.html#setNextFocusDownId(int)


3

您可能正在寻找 android:nextFocusRight、android:nextFocusLeft、android:nextFocusUp 和 android:nextFocusDown 这些属性。如果选项卡按钮的默认行为是将焦点移动到第二行,则可以设置 android:nextFocusDown 为您想要下一个获得焦点的视图的ID。然后,当用户按下选项卡时,它会将焦点移动到您指定的任何视图,即使在这种情况下它恰好位于当前视图的右侧而不是下方。


我编辑了原始帖子来显示我正在使用的代码,我尝试了NextFocusRight,但似乎没有做任何事情,你能看看那是否正确吗? - dalesit

1

android:nextFocusLeft替换为android:nextFocusForward


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接