Passa a un altro EditText quando si fa clic su Soft Keyboard Next su Android


217

Quando premo il tasto "Avanti", il focus sul User EditText deve essere spostato sulla password. Quindi, da Password, deve spostarsi a destra e così via. Potete aiutarmi su come codificarlo?

inserisci qui la descrizione dell'immagine

<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
Dai un'occhiata ad Android: imeOptions
Tobrun,

dove devo mettere quel codice?
androidBoomer

Risposte:


475

Gestione della messa a fuoco

Il movimento della messa a fuoco si basa su un algoritmo che trova il vicino più vicino in una determinata direzione. In rari casi, l'algoritmo predefinito potrebbe non corrispondere al comportamento previsto dello sviluppatore.

Modifica il comportamento predefinito della navigazione direzionale utilizzando i seguenti attributi XML:

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

Oltre alla navigazione direzionale è possibile utilizzare la navigazione a schede. Per questo è necessario utilizzare

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

Per ottenere una vista particolare da mettere a fuoco, chiama

view.requestFocus()

Per ascoltare alcuni eventi di focus che cambiano usa a View.OnFocusChangeListener


Pulsante tastiera

È possibile utilizzare android:imeOptionsper gestire quel pulsante extra sulla tastiera.

Funzionalità aggiuntive che puoi abilitare in un IME associato a un editor per migliorare l'integrazione con la tua applicazione. Le costanti qui corrispondono a quelle definite da imeOptions.

Le costanti di imeOptions includono una varietà di azioni e flag, vedi il link sopra per i loro valori.

Esempio di valore

AzioneAvanti :

il tasto azione esegue un'operazione "successiva", portando l'utente al campo successivo che accetterà il testo.

ActionDone :

il tasto azione esegue un'operazione "completata", in genere significa che non c'è altro da inserire e l'IME verrà chiuso.

Esempio di codice:

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

Se vuoi ascoltare gli eventi imeoptions usa 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
Nel mio caso ha android:nextFocusForward="@+id/.."fatto il trucco.
Mr. Moustard,

23
Ho messo android:imeOptions="actionNext"su tutti i miei EditTexts e il problema è sparito. Mille grazie.
Joaquin Iurchuk,

3
Ho dovuto usare sia Joaquin che Mr.Moustard per ogni EditText.
Scott Biggs,

9
Per la mia app, basta usare Android: imeOptions = "actionNext" non ha funzionato. EditText aveva bisogno di android: inputType = "[qualcosa]" prima di ascoltare il flag imeOptions.
Chris Kelly,

4
Come fa a sapere quale focalizzare quando si preme NEXT? Controlla "giusto" e poi "giù"? Esiste una funzione per mettere a fuoco l'ID della vista successiva, se l'utente preme il tasto SUCCESSIVO?
sviluppatore Android

66
android:inputType="text"

dovrebbe portare lo stesso effetto. Dopo aver toccato il prossimo per mettere a fuoco l'elemento successivo.

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

utilizzare questo in aggiunta se non si desidera che la vista successiva abbia lo stato attivo


34

aggiungi il tuo editText

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

aggiungi proprietà all'attività in manifest

    android:windowSoftInputMode="adjustResize|stateHidden"

nel file di layout ScrollView impostato come layout principale o principale tutta l'interfaccia utente

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

se non lo desideri ogni volta che lo aggiunge, crea lo stile: aggiungi lo stile in valori / style.xml

default / stile:

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

L'uso di android:singleLine="true"è deprecato.
Praveenkumar,

18

Usa la seguente riga

android:nextFocusDown="@+id/parentedit"

parenteditè l'ID del prossimo EditTextda focalizzare.

La riga sopra avrà anche bisogno della riga seguente.

android:inputType="text"

o

android:inputType="number"

Grazie per il suggerimento @Alexei Khlebnikov.


3
Ha funzionato per me. Insieme a android:inputType="text"o android:inputType="number".
Alexei Khlebnikov,

se nextFocusDown non funziona, quindi utilizzare nextFocusForward. Mi ha aiutato
Kishan Solanki il

android: nextFocusDown = "@ + id / parentedit" ha funzionato per me! grazie
DIRTY DAVE

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

Aggiunta di un campo aggiuntivo

Android: InputType = "textNoSuggestions"

ha funzionato nel mio 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" />

Queste tre linee fanno la magia

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

6

Nel gestore onEditorAction, tieni presente che devi restituire un valore booleano che indica se stai gestendo l'azione (true) o se hai applicato una logica e desideri il comportamento normale (false), come nell'esempio seguente:

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

L'ho trovato quando sono tornato vero dopo aver eseguito la mia logica poiché la messa a fuoco non si è mossa.


3

basta usare il seguente codice funzionerà bene e utilizzerà inputType per ogni edittext e il pulsante successivo apparirà sulla tastiera.

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

3

Prova ad usare android: imeOptions = "actionNext" tag per ogni editText nella vista si focalizzerà automaticamente sul prossimo edittext quando fai clic su Next della softKeyboard.


2

In alcuni casi potrebbe essere necessario spostare manualmente lo stato attivo sul campo successivo:

focusSearch(FOCUS_DOWN).requestFocus();

Potrebbe essere necessario se, ad esempio, si dispone di un campo di testo che apre un selettore di date al clic e si desidera che lo stato attivo si sposti automaticamente al campo di input successivo una volta selezionata una data dall'utente e il selettore si chiude. Non c'è modo di gestirlo in XML, deve essere fatto a livello di codice.


2

Modo semplice, quando hai solo pochi campi uno per uno:

È necessario impostare

android:maxLines="1"

android:imeOptions="actionNext"

android:inputType="" <- Imposta il tuo tipo di testo, in caso contrario sarà Multiline e impedirà di andare avanti

Campione:

<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
Potresti voler dare una spiegazione con la tua risposta per spiegare perché la tua è migliore delle altre. Puoi premere il pulsante "modifica" per aggiungere alla tua risposta.
Brian Tompsett - 莱恩 莱恩

1

Se si desidera utilizzare una multilinea EditTextcon imeOptions, provare:

android:inputType="textImeMultiLine"

1

Aggiungi inputType a edittext e su Invio passerà al prossimo edittext

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

e molti altri.

inputType = textMultiLine non passa al prossimo edittext su invio


1

In Kotlin ho usato Bellow come ..

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

Se hai l'elemento in vista di scorrimento, puoi anche risolvere questo problema come:

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

e nella tua attività:

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

Modo semplice:

  • Sposta automaticamente il cursore al prossimo edittext
  • Se l'edittext è l'ultimo input -> tastiera nascosta

Aggiungi questo al campo edittext nel file .xml

android:inputType="textCapWords"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.