在Android上单击“软键盘下一步”时,移至另一个EditText


216

当我按“下一步”时,必须将用户EditText的焦点移到“密码”上。然后,必须从“密码”向右移动,依此类推。您能帮我编码吗?

在此处输入图片说明

<LinearLayout
    android:id="@+id/LinearLayout01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="User Name*" />

    <EditText
        android:id="@+id/txt_User"
        android:layout_width="290dp"
        android:layout_height="33dp"
        android:singleLine="true" />

</LinearLayout>


<LinearLayout
    android:id="@+id/LinearLayout02"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Password*" />

    <EditText
        android:id="@+id/txt_Password"
        android:layout_width="290dp"
        android:layout_height="33dp"
        android:singleLine="true"
        android:password="true" />

    <TextView
        android:id="@+id/confirm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Password*" />

    <EditText
        android:id="@+id/txt_Confirm"
        android:layout_width="290dp"
        android:layout_height="33dp"
        android:singleLine="true"
        android:password="true" />

</LinearLayout>

1
看看android:imeOptions
Tobrun

我应该把代码放在哪里?
androidBoomer 2013年

Answers:


472

焦点处理

焦点移动基于一种算法,该算法在给定方向上找到最近的邻居。在极少数情况下,默认算法可能与开发人员的预期行为不匹配。

通过使用以下XML属性来更改方向导航的默认行为:

android:nextFocusDown="@+id/.."  
android:nextFocusLeft="@+id/.."    
android:nextFocusRight="@+id/.."    
android:nextFocusUp="@+id/.."  

除了方向导航,您还可以使用标签导航。为此,您需要使用

android:nextFocusForward="@+id/.."

要获取特定的观点以引起关注,请致电

view.requestFocus()

要收听某些变化的焦点事件,请使用 View.OnFocusChangeListener


键盘按键

您可以使用它android:imeOptions来处理键盘上的该额外按钮。

您可以在与编辑器关联的IME中启用其他功能,以改善与应用程序的集成。这里的常量对应于imeOptions定义的常量。

imeOptions的常量包括各种操作和标志,有关其值,请参见上面的链接。

值示例

ActionNext

操作键执行“下一步”操作,将用户带到将接受文本的下一个字段。

ActionDone

操作键执行“完成”操作,通常意味着没有其他输入,并且IME将关闭。

代码示例:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="32dp"
        android:layout_marginTop="16dp"
        android:imeOptions="actionNext"
        android:maxLines="1"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editText1"
        android:layout_below="@+id/editText1"
        android:layout_marginTop="24dp"
        android:imeOptions="actionDone"
        android:maxLines="1"
        android:ems="10" />

</RelativeLayout>

如果您想听imeoptions事件,请使用TextView.OnEditorActionListener

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            performSearch();
            return true;
        }
        return false;
    }
});


20
就我而言,是android:nextFocusForward="@+id/.."成功的秘诀。
穆斯塔德先生2014年

23
我把android:imeOptions="actionNext"所有的EditTexts 放进去了,问题就消失了。非常感谢。
Joaquin Iurchuk

3
对于每个EditText,我必须同时使用joaquin和Mr.Moustard。
Scott Biggs

9
对于我的应用程序,仅使用android:imeOptions =“ actionNext”不起作用。EditText需要android:inputType =“ [something]”才能监听imeOptions标志。
克里斯·凯利

4
按下NEXT怎么知道要聚焦哪一个?是否先检查“正确”再检查“下降”?如果用户按下NEXT键,是否可以获取下一个视图ID的功能?
Android开发人员

66
android:inputType="text"

应该带来相同的效果。点击下一步后,将焦点移至下一个元素。

android:nextFocusDown="@+id/.."

如果您不希望下一个视图获得焦点,请另外使用此选项


34

添加您的editText

android:imeOptions="actionNext"
android:singleLine="true"

向清单中的活动添加属性

    android:windowSoftInputMode="adjustResize|stateHidden"

在布局文件ScrollView中设置为root或父布局所有ui

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.ukuya.marketplace.activity.SignInActivity">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

       <!--your items-->

    </ScrollView>

</LinearLayout>

如果不想每次添加,请创建样式:在values / style.xml中添加样式

默认/样式:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="editTextStyle">@style/AppTheme.CustomEditText</item>
    </style>

<style name="AppTheme.CustomEditText"     parent="android:style/Widget.EditText">
        //...
        <item name="android:imeOptions">actionNext</item>
        <item name="android:singleLine">true</item>
    </style>

的使用android:singleLine="true"已描述。
Praveenkumar

18

使用以下行

android:nextFocusDown="@+id/parentedit"

parentedit是下一个EditText要关注的ID 。

上面的行也需要下面的行。

android:inputType="text"

要么

android:inputType="number"

感谢您的建议@Alexei Khlebnikov。


3
它为我工作。与android:inputType="text"或一起使用android:inputType="number"
Alexei Khlebnikov 2015年

如果nextFocusDown不起作用,则使用nextFocusForward。它帮助了我
Kishan Solanki

android:nextFocusDown =“ @ + id / parentedit”对我有用!谢谢
DIRTY DAVE

12
android:inputType="textNoSuggestions"
android:imeOptions="actionNext"
android:singleLine="true"
android:nextFocusForward="@+id/.."

添加额外的字段

android:inputType =“ textNoSuggestions”

就我而言工作了!


9
<AutoCompleteTextView
                android:id="@+id/email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@drawable/user"
                android:hint="@string/username"
                android:inputType="text"
                android:maxLines="1"
                android:imeOptions="actionNext"
                android:singleLine="true" />

这三行神奇

            android:maxLines="1"
            android:imeOptions="actionNext"
            android:singleLine="true"

6

在onEditorAction处理程序中,请记住,您必须返回一个布尔值,该布尔值指示您是在处理操作(true)还是应用了某些逻辑并希望正常行为(false),如以下示例所示:

EditText te = ...
te.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event){
        if (actionId == EditorInfo.IME_ACTION_NEXT) {
            // Some logic here.
            return true; // Focus will do whatever you put in the logic.
        }
        return false;  // Focus will change according to the actionId
    }
});

我在执行逻辑后返回true时发现了这一点,因为焦点没有移动。


3

只需使用以下代码,它将可以正常工作,并对每个edittext使用inputType,然后键盘上将出现下一个按钮。

android:inputType="text" or android:inputType="number" etc

2

在某些情况下,您可能需要将焦点手动移至下一个字段:

focusSearch(FOCUS_DOWN).requestFocus();

例如,如果您有一个文本字段,该文本字段在单击时打开一个日期选择器,并且您希望焦点在用户选择日期并且选择器关闭后自动移至下一个输入字段,则可能需要此功能。无法用XML处理此问题,必须以编程方式完成。


2

一种简单的方法,当您只有几个字段一一对应时:

需要设定

android:maxLines="1"

android:imeOptions="actionNext"

android:inputType="" <-设置您的文本类型,在其他情况下将为多行,并防止继续

样品:

<EditText android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:textSize="@dimen/text_large"
              android:maxLines="1"
              android:inputType="textEmailAddress"
              android:imeOptions="actionNext"
              android:layout_marginLeft="@dimen/element_margin_large"
              android:layout_marginRight="@dimen/element_margin_large"
              android:layout_marginTop="0dp"/>


1
<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ScrollView01"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:scrollbars="vertical" >

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="666dp"
android:background="#1500FFe5"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >
<TextView
    android:id="@+id/TextView02"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/editGrWt"
    android:layout_marginTop="14dp"
    android:layout_toLeftOf="@+id/textView3"
    android:ems="6"
    android:text="    Diamond :"
    android:textColor="@color/background_material_dark"
    android:textSize="15sp" />
  <EditText
    android:id="@+id/editDWt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/TextView02"
    android:layout_alignLeft="@+id/editGrWt"
    android:background="@color/bright_foreground_inverse_material_light"
    android:ems="4"
    android:hint="Weight"
    android:inputType="numberDecimal"
    android:nextFocusLeft="@+id/editDRate"
    android:selectAllOnFocus="true"
    android:imeOptions="actionNext"

    />
 <requestFocus />


<TextView
    android:id="@+id/TextView03"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/TextView02"
    android:layout_below="@+id/TextView02"
    android:layout_marginTop="14dp"
    android:ems="6"
    android:text="    Diamond :"
    android:textColor="@color/background_material_dark"
    android:textSize="15sp" />

<EditText
    android:id="@+id/editDWt1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/TextView03"
    android:layout_alignBottom="@+id/TextView03"
    android:layout_alignLeft="@+id/editDWt"
    android:background="@color/bright_foreground_inverse_material_light"
    android:ems="4"
    android:hint="Weight"
    android:inputType="numberDecimal"
    android:text="0"
    android:selectAllOnFocus="true"
    android:imeOptions="actionNext"/>
 <requestFocus />

<TextView
    android:id="@+id/TextView04"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/editDWt1"
    android:layout_marginTop="14dp"
    android:layout_toLeftOf="@+id/textView3"
    android:ems="6"
    android:text="         Stone :"
    android:textColor="@color/background_material_dark"
    android:textSize="15sp" />

<EditText
    android:id="@+id/editStWt1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/TextView04"
    android:layout_alignBottom="@+id/TextView04"
    android:layout_alignLeft="@+id/editDWt1"
    android:background="@color/bright_foreground_inverse_material_light"
    android:ems="4"
    android:hint="Weight"
    android:inputType="numberDecimal"
    android:nextFocusForward="@+id/editStRate1"
    android:imeOptions="actionNext" />
 <requestFocus />
  <TextView
     android:id="@+id/TextView05"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignLeft="@+id/TextView04"
     android:layout_below="@+id/editStRate1"
     android:layout_marginTop="14dp"
     android:ems="6"
     android:text="         Stone :"
     android:textColor="@color/background_material_dark"
     android:textSize="15sp" />


</RelativeLayout>

</ScrollView>

4
您可能需要在答案中加上一个解释,以解释为什么您的人比其他人更好。您可以按“编辑”按钮添加到您的答案中。
Brian Tompsett-汤莱恩2015年

1

如果你想使用多EditTextimeOptions,试试:

android:inputType="textImeMultiLine"

1

将inputType添加到edittext,并在输入时进入下一个edittext

android:inputType="text"
android:inputType="textEmailAddress"
android:inputType="textPassword" 

还有很多。

输入时,inputType = textMultiLine不会转到下一个edittext


1

在科特林,我曾经用过波纹管..

  1. xml:

    <EditText
      android:id="@+id/et_amount"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:imeOptions="actionNext"
      android:inputType="number"
      android:singleLine="true" />
  2. 在科特林:

    et_amount.setOnEditorActionListener { v, actionId, event ->
    
        if (actionId == EditorInfo.IME_ACTION_NEXT) {
            // do some code
            true
        } else {
            false
        }
    }

0
Inside Edittext just arrange like this


<EditText
    android:id="@+id/editStWt1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:imeOptions="actionNext" //now its going to rightside/next field automatically
    ..........
    .......

</EditText>

0

如果您在滚动视图中具有该元素,则还可以通过以下方式解决此问题:

<com.google.android.material.textfield.TextInputEditText
                android:id="@+id/ed_password"
                android:inputType="textPassword"
                android:focusable="true"
                android:imeOptions="actionNext"
                android:nextFocusDown="@id/ed_confirmPassword" />

在您的活动中:

edPassword.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_NEXT) {
                focusOnView(scroll,edConfirmPassword);
                return true;
            }
            return false;
        }
    });

public void focusOnView(ScrollView scrollView, EditText viewToScrollTo){
    scrollView.post(new Runnable() {
        @Override
        public void run() {
            scrollView.smoothScrollTo(0, viewToScrollTo.getBottom());
            viewToScrollTo.requestFocus();
        }
    });
}

0

简单方法:

  • 自动将光标移到下一个edittext
  • 如果最后输入edittext->隐藏的键盘

将此添加到.xml文件中的edittext字段

android:inputType="textCapWords"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.