按下“回车键”跳到下一个文本框。

31

在EditText中,输入回车键后,系统会在其中创建新行。我想要将焦点放在下一个EditText上,而不是在新的一行里。该如何编写代码?我的xml代码如下:

    <EditText
    android:id="@+id/txtNPCode"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="18sp"
    android:layout_alignLeft="@+id/lblNPCode"
    android:layout_below="@+id/lblNPCode"
    android:layout_centerHorizontal="true"/>
<EditText
    android:id="@+id/txtCNPCode"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="18sp"
    android:layout_alignLeft="@+id/lblCNPCode"
    android:layout_below="@+id/lblCNPCode"
    android:layout_centerHorizontal="true"/>  

我也在setOnKeyListener中捕获按键代码。

   tCNPCode.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            if(keyCode == 66) {
                Toast.makeText(S_PCode.this, "Enter Key", Toast.LENGTH_LONG).show();
                //tNPCode.setFocusable(true);
            }
            return false;
        }
    });
6个回答

38

您甚至不需要使用 OnKeyListener。只需在EditText中添加一行android:singleLine="true"即可。完成此操作后,EditText的行为与您想要的完全相同。因此,在您特定的情况下:

<EditText
    android:id="@+id/txtNPCode"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="18sp"
    android:layout_alignLeft="@+id/lblNPCode"
    android:layout_below="@+id/lblNPCode"
    android:layout_centerHorizontal="true"
    android:singleLine="true"
/>
<EditText
    android:id="@+id/txtCNPCode"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="18sp"
    android:layout_alignLeft="@+id/lblCNPCode"
    android:layout_below="@+id/lblCNPCode"
    android:layout_centerHorizontal="true"
/>

解决了该问题。


感谢您提供这个简单易懂的解释,非常棒! - anetha
2
这个没问题,但是 android:singleLine="true" 已经被弃用了。 - Surendar D

18

你需要使用requestFocus方法。在你的情况下,代码应该如下:

tCNPCode.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_ENTER) {
            txtCNPCode.requestFocus();
        }
        return false;
    }
});

1
谢谢。我使用requestFocus。它起作用了。需要添加return true吗? - soclose
3
我建议你也用ACTION_UP过滤一下,因为否则onKey方法会被触发两次。如果你正在将setOnKeyListener实现到一个ArrayList<EditText>内的EditText列表中,那你就有可能前进两步。代码如下: if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) - jkanini
我不会使用实际的int字面量,因为它根本不可读。 - Tyler

10

考虑IME选项,这里有良好的描述http://androidcookbook.com/Recipe.seam;jsessionid=C824437B48F346E23FBE5828969029B4?recipeId=422和文档http://developer.android.com/reference/android/widget/TextView.html#attr_android:imeOptions

唯一需要做的就是在每个EditText上添加属性android:imeOptions="actionNext"。键盘出现一个“下一个”按钮替代Enter键,并允许导航到下一个EditText。

但是"actionNext"的顺序是从上到下的。例如,如果您有水平布局:

<LinearLayout android:orientation="horizontal" >
        <EditText android:id="@+id/et1" android:imeOptions="actionNext" />
        <EditText android:id="@+id/et2" android:imeOptions="actionNext" />
</LinearLayout>

et2没有得到焦点。您需要在代码中修复它:

et1.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(TextView v, int actionId,
            KeyEvent event)
    {
        switch (actionId)
        {
        case EditorInfo.IME_ACTION_NEXT:
            boolean result = false;
            TextView v1 = (TextView) v.focusSearch(View.FOCUS_RIGHT);
            if (v1 != null)
                result = v1.requestFocus(View.FOCUS_RIGHT);
            else if (!result)
            {
                v1 = (TextView) v.focusSearch(View.FOCUS_DOWN);
                if (v1 != null)
                    result = v1.requestFocus(View.FOCUS_DOWN);
            }
            if (!result)
                v.onEditorAction(actionId);
            break;

        default:
            v.onEditorAction(actionId);
            break;
        }
        return true;
    }
});

原始链接: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/OykOG6XtE8w


10
最好的方法是使用其中一个 inputType 选项,例如:android:inputType="textPersonName",这将实现所需的效果。也可以查看其他选项,这将节省您在未来的时间 :)。
不应使用 android:singleLine="true",因为它已被弃用。以下是文档对它的说明:
此属性已废弃,并由 inputType 属性中的 textMultiLine 标志替换。注意更改现有布局时要小心,因为 singeLine 的默认值为 false(多行模式),但如果您指定 inputType 的任何值,则默认为单行模式。(如果找到 singleLine 和 inputType 属性,则 inputType 标志将覆盖 singleLine 的值)。

2

使用一行代码(Java)

tCNPCode.setSingleLine(true);

Kotlin

tCNPCode.isSingleLine = true

按下Enter键将导航到下一个项目


1
只需在xml布局文件中的EditText框中设置最大行数:android:maxLength="1"

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