Перейдіть до іншого EditText, коли на Android натисніть "Soft Keyboard Next"


216

Коли я натискаю "Далі", фокус на User 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

Відповіді:


473

Фокусна робота

Рух фокусування базується на алгоритмі, який знаходить найближчого сусіда в заданому напрямку. У рідкісних випадках алгоритм за замовчуванням може не відповідати передбачуваній поведінці розробника.

Змініть поведінку орієнтованої навігації за замовчуванням, використовуючи такі атрибути XML:

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

Крім орієнтованої навігації ви можете використовувати навігацію по вкладках. Для цього вам потрібно скористатися

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

Щоб отримати фокус, зателефонуйте, зателефонуйте

view.requestFocus()

Для прослуховування певних подій, що змінюються, використовуйте a 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
Мені довелося використовувати і Joaquin, і Mr.Moustard's для кожного EditText.
Скотт Біггс

9
У моєму додатку просто не працює android: imeOptions = "actionNext" не працює. EditText потрібен андроїд: inputType = "[щось]", перш ніж він прослухає прапор imeOptions.
Кріс Келлі

4
Звідки можна знати, на який слід зосередитись, натискаючи НАСТУПНО? Чи перевіряє це "правильно", а потім "вниз"? Чи є функція для фокусування ідентифікатора наступного перегляду, якщо користувач натисне наступну клавішу?
андроїд розробник

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>

якщо ви не хочете кожен раз, коли він додає, створіть стиль: додайте стиль у значення / 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"

Дякую за пропозицію @Alexei Hlebnikov.


3
Це працювало для мене. Разом з android:inputType="text"або android:inputType="number".
Олексій Хлебников

якщо nextFocusDown не працюватиме, використовуйте nextFocusForward. Це мені допомогло
Кішан Соланкі

android: nextFocusDown = "@ + id / parentedit" працював на мене! спасибі
DIRTY DAVE

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

Додавання додаткового поля

android: inputType = "textNoSuggesitions"

працював у моєму випадку!


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

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"/>

2

Спробуйте використовувати тег android: imeOptions = "actionNext" для кожного editText у Перегляді, він автоматично зосередиться на наступному редакційному тексті, натиснувши кнопку Далі на softKeyboard.


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

У Котліні я використовував Беллоу, як ..

  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

Простий спосіб:

  • Автоматичне переміщення курсору до наступного редагування тексту
  • Якщо текст редагування останній -> прихована клавіатура

Додайте це до поля редагування тексту у файлі .xml

android:inputType="textCapWords"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.