Переход на другой EditText при нажатии Soft Keyboard Next на Android


217

Когда я нажимаю «Далее», фокус на пользовательском тексте редактирования должен быть перемещен в пароль. Затем из пароля он должен переместиться вправо и так далее. Можете ли вы помочь мне, как его кодировать?

введите описание изображения здесь

<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
Взгляните на андроид: imeOptions
Тобрун

где я должен положить этот код?
androidBoomer

Ответы:


475

Фокусировка

Движение фокуса основано на алгоритме, который находит ближайшего соседа в заданном направлении. В редких случаях алгоритм по умолчанию может не соответствовать предполагаемому поведению разработчика.

Измените поведение по умолчанию для направленной навигации, используя следующие атрибуты 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/.."сделали свое дело .
Мистер Мюстард

23
Я положил android:imeOptions="actionNext"на все мои EditTexts и проблема исчезла. Большое спасибо.
Хоакин Иурчук

3
Мне пришлось использовать и Хоакина, и мистера Мустарда для каждого EditText.
Скотт Биггс

9
Для моего приложения просто использование android: imeOptions = "actionNext" не сработало. EditText требуется Android: inputType = "[что-то]", прежде чем он будет слушать флаг imeOptions.
Крис Келли

4
Как он узнает, на какую фокусировку нажать NEXT? Проверяет ли он «право», а затем «вниз»? Есть ли функция, позволяющая сфокусировать идентификатор следующего представления, если пользователь нажмет клавишу NEXT?
Android-разработчик

66
android:inputType="text"

должен принести тот же эффект. После нажатия рядом, чтобы перенести фокус на следующий элемент.

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

используйте это в дополнение, если вы не хотите, чтобы следующий вид получил фокус


34

добавьте ваш editText

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

добавить свойство к активности в манифесте

    android:windowSoftInputMode="adjustResize|stateHidden"

в файле макета ScrollView установить в качестве корневого или родительского макета все пользовательский интерфейс

<?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"запрещено.
Правеенкумар

18

Используйте следующую строку

android:nextFocusDown="@+id/parentedit"

parenteditидентификатор следующего, EditTextна которого нужно сфокусироваться.

В приведенной выше строке также потребуется следующая строка.

android:inputType="text"

или

android:inputType="number"

Спасибо за предложение @ Алексей Хлебников.


3
Это сработало для меня. Вместе с android:inputType="text"или android:inputType="number".
Алексей Хлебников

если nextFocusDown не будет работать, тогда используйте nextFocusForward. Это помогло мне
Кишан Соланки

android: nextFocusDown = "@ + id / parentedit" работает для меня! спасибо
грязный Дэйв

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

Добавление дополнительного поля

андроид: 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
    }
});

Я нашел это, когда вернул истину после выполнения своей логики, так как фокус не двигался.


3

просто используйте следующий код, он будет работать нормально и используйте inputType для каждого текста редактирования, и следующая кнопка появится на клавиатуре.

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

3

Попробуйте использовать тег android: imeOptions = "actionNext" для каждого editText в представлении, он будет автоматически фокусироваться на следующем тексте редактирования, когда вы нажимаете Next на программной клавише.


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
Возможно, вы захотите поставить объяснение с вашим ответом, чтобы объяснить, почему ваши лучше, чем другие. Вы можете нажать кнопку «Редактировать», чтобы добавить свой ответ.
Брайан Томпсетт - 莱恩 莱恩

1

Если вы хотите использовать мультилинию EditTextс imeOptions, попробуйте:

android:inputType="textImeMultiLine"

1

Добавьте inputType к тексту редактирования и при вводе он перейдет к следующему тексту редактирования

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

и многое другое.

inputType = textMultiLine не переходит к следующему тексту редактирования при вводе


1

В Kotlin я использовал Bellow как ..

  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 в .xml файле

android:inputType="textCapWords"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.