Muévase a otro EditText cuando haga clic en Soft Keyboard Next en Android

216

Cuando presiono 'Siguiente', el foco en el Texto de edición del usuario debe moverse a la Contraseña. Luego, desde Contraseña, debe moverse hacia la derecha y así sucesivamente. ¿Me pueden ayudar a codificarlo?

ingrese la descripción de la imagen aquí

<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>
androidBoomer
fuente
1
Eche un vistazo a android: imeOptions
Tobrun
¿Dónde debo poner ese código?
androidBoomer

Respuestas:

473

Manejo de enfoque

El movimiento del foco se basa en un algoritmo que encuentra al vecino más cercano en una dirección determinada. En casos excepcionales, el algoritmo predeterminado puede no coincidir con el comportamiento previsto del desarrollador.

Cambie el comportamiento predeterminado de la navegación direccional utilizando los siguientes atributos XML:

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

Además de la navegación direccional, puede usar la navegación con pestañas. Para esto necesitas usar

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

Para obtener una vista particular para enfocarse, llame

view.requestFocus()

Para escuchar ciertos eventos de enfoque cambiante, use un View.OnFocusChangeListener


Botón del teclado

Puede usarlo android:imeOptionspara manejar ese botón adicional en su teclado.

Funciones adicionales que puede habilitar en un IME asociado con un editor para mejorar la integración con su aplicación. Las constantes aquí corresponden a las definidas por imeOptions.

Las constantes de imeOptions incluyen una variedad de acciones y banderas, consulte el enlace de arriba para conocer sus valores.

Ejemplo de valor

Acción Siguiente :

la tecla de acción realiza una operación "siguiente", llevando al usuario al siguiente campo que aceptará texto.

ActionDone :

la tecla de acción realiza una operación "hecho", lo que generalmente significa que no hay nada más que ingresar y que el IME se cerrará.

Ejemplo de código:

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

Si desea escuchar eventos imeoptions use a 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;
    }
});

Tobrun
fuente
20
En mi caso android:nextFocusForward="@+id/.."hizo el truco.
Mr.Moustard
23
Puse android:imeOptions="actionNext"a todos mis EditTexts y el problema desapareció. Muchas gracias.
Joaquin Iurchuk
3
Tuve que usar joaquin y Mr.Moustard para cada EditText.
Scott Biggs
99
Para mi aplicación, simplemente usando android: imeOptions = "actionNext" no funcionó. EditText necesitaba android: inputType = "[algo]" antes de escuchar la bandera imeOptions.
Chris Kelly
44
¿Cómo sabe cuál enfocar al presionar NEXT? ¿Comprueba el "derecho" y luego el "abajo"? ¿Existe una función para enfocar la siguiente ID de la vista, si el usuario presiona la tecla SIGUIENTE?
Desarrollador de Android
66
android:inputType="text"

debería traer el mismo efecto. Después de presionar next para llevar el enfoque al siguiente elemento.

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

use esto además si no desea que la próxima vista obtenga el foco

Matthias H
fuente
34

agrega tu editText

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

agregar propiedad a la actividad en manifiesto

    android:windowSoftInputMode="adjustResize|stateHidden"

en el archivo de diseño ScrollView establecido como diseño raíz o padre todo 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>

si no quieres cada vez que agrega, crea estilo: agrega estilo en values ​​/ style.xml

Estilo por Defecto:

<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>
Abror Esonaliyev
fuente
El uso de android:singleLine="true"es depricated.
Praveenkumar
18

Usa la siguiente línea

android:nextFocusDown="@+id/parentedit"

parentedites la identificación del próximo EditTexten enfocarse.

La línea anterior también necesitará la siguiente línea.

android:inputType="text"

o

android:inputType="number"

Gracias por la sugerencia @Alexei Khlebnikov.

Vacaciones de primavera
fuente
3
Funcionó para mi. Junto con android:inputType="text"o android:inputType="number".
Alexei Khlebnikov
si nextFocusDown no funciona, use nextFocusForward. Me ayudó
Kishan Solanki
android: nextFocusDown = "@ + id / parentedit" funcionó para mí! gracias
SUCIO DAVE
12
android:inputType="textNoSuggestions"
android:imeOptions="actionNext"
android:singleLine="true"
android:nextFocusForward="@+id/.."

Agregar campo extra

android: inputType = "textNoSuggestions"

trabajado en mi caso!

Tripathee Gaurav
fuente
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" />

Estas tres líneas hacen la magia

            android:maxLines="1"
            android:imeOptions="actionNext"
            android:singleLine="true"
Hitesh Kushwah
fuente
6

En su controlador onEditorAction, tenga en cuenta que debe devolver un valor booleano que indica si está manejando la acción (verdadero) o si aplicó algo de lógica y desea el comportamiento normal (falso), como en el siguiente ejemplo:

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
    }
});

Encontré esto cuando volví verdadero después de realizar mi lógica ya que el foco no se movió.

user3701500
fuente
3

solo use el siguiente código, funcionará bien y use inputType para cada texto de edición y el siguiente botón aparecerá en el teclado.

android:inputType="text" or android:inputType="number" etc
pawan kumar
fuente
2

En algunos casos, es posible que deba mover el foco al siguiente campo manualmente:

focusSearch(FOCUS_DOWN).requestFocus();

Es posible que necesite esto si, por ejemplo, tiene un campo de texto que abre un selector de fecha al hacer clic y desea que el foco se mueva automáticamente al siguiente campo de entrada una vez que el usuario selecciona una fecha y el selector se cierra. No hay forma de manejar esto en XML, tiene que hacerse mediante programación.

flawyte
fuente
2

De manera simple, cuando tiene pocos campos uno por uno:

Necesito establecer

android:maxLines="1"

android:imeOptions="actionNext"

android:inputType="" <- Establezca su tipo de texto, en otro caso será Multilínea y evitará que siga

Muestra:

<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"/>
PsyhoLord
fuente
2

Intente usar la etiqueta android: imeOptions = "actionNext" para cada editText en la Vista, se enfocará automáticamente al siguiente texto de edición cuando haga clic en Siguiente del softKeyboard.

Kuldeep Rathee
fuente
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>
Nilkanth vithani
fuente
44
Es posible que desee poner una explicación con su respuesta para explicar por qué la suya es mejor que las demás. Puede presionar el botón "editar" para agregar a su respuesta.
Brian Tompsett - 汤 莱恩
1

Si desea utilizar una línea múltiple EditTextcon imeOptions, intente:

android:inputType="textImeMultiLine"
Chris
fuente
1

Agregue inputType a edittext y al ingresar irá al siguiente edittext

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

y muchos más.

inputType = textMultiLine no va al siguiente texto de edición al ingresar

Sharmad Desai
fuente
1

En Kotlin he usado Bellow como ...

  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. en kotlin:

    et_amount.setOnEditorActionListener { v, actionId, event ->
    
        if (actionId == EditorInfo.IME_ACTION_NEXT) {
            // do some code
            true
        } else {
            false
        }
    }
Enamul Haque
fuente
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>
Kishore Reddy
fuente
0

Si tiene el elemento en la vista de desplazamiento, también puede resolver este problema como:

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

y en tu actividad:

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();
        }
    });
}
Abdullah Hashmi
fuente
0

Manera simple :

  • Mover automáticamente el cursor al siguiente texto de edición
  • Si edittext es la última entrada -> teclado oculto

Agregue esto al campo edittext en el archivo .xml

android:inputType="textCapWords"
vuhoanghiep1993
fuente