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>

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


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


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>

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.


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!


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"

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


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

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.


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

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.


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>

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"

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


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

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

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

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"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.