Passer à un autre EditText lorsque Soft Keyboard Next est cliqué sur Android

216

Lorsque j'appuie sur «Suivant», le focus sur le User EditText doit être déplacé vers le mot de passe. Ensuite, à partir du mot de passe, il doit se déplacer vers la droite et ainsi de suite. Pouvez-vous m'aider à le coder?

entrez la description de l'image ici

<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
la source
1
Jetez un oeil à Android: imeOptions
Tobrun
où dois-je mettre ce code?
androidBoomer

Réponses:

473

Gestion de la mise au point

Le mouvement de mise au point est basé sur un algorithme qui trouve le plus proche voisin dans une direction donnée. Dans de rares cas, l'algorithme par défaut peut ne pas correspondre au comportement souhaité du développeur.

Modifiez le comportement par défaut de la navigation directionnelle à l'aide des attributs XML suivants:

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

Outre la navigation directionnelle, vous pouvez utiliser la navigation par onglets. Pour cela, vous devez utiliser

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

Pour obtenir une vue particulière pour se concentrer, appelez

view.requestFocus()

Pour écouter certains événements de focus changeants, utilisez un View.OnFocusChangeListener


Bouton clavier

Vous pouvez utiliser android:imeOptionspour gérer ce bouton supplémentaire sur votre clavier.

Fonctionnalités supplémentaires que vous pouvez activer dans un IME associé à un éditeur pour améliorer l'intégration avec votre application. Les constantes correspondent ici à celles définies par imeOptions.

Les constantes d'imeOptions incluent une variété d'actions et de drapeaux, voir le lien ci-dessus pour leurs valeurs.

Exemple de valeur

ActionSuivant :

la touche d'action effectue une opération "suivante", amenant l'utilisateur au champ suivant qui acceptera le texte.

Action terminée :

la touche d'action effectue une opération "terminée", ce qui signifie généralement qu'il n'y a plus rien à saisir et que l'IME sera fermé.

Exemple de code:

<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 vous souhaitez écouter les événements imeoptions, utilisez 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
la source
20
Dans mon cas, a android:nextFocusForward="@+id/.."fait l'affaire.
Mr.Moustard
23
J'ai mis android:imeOptions="actionNext"tous mes EditTexts et le problème a disparu. Merci beaucoup.
Joaquin Iurchuk
3
J'ai dû utiliser à la fois joaquin et Mr.Moustard pour chaque EditText.
Scott Biggs
9
Pour mon application, l'utilisation d'Android: imeOptions = "actionNext" n'a pas fonctionné. EditText avait besoin d'android: inputType = "[quelque chose]" avant d'écouter le drapeau imeOptions.
Chris Kelly
4
Comment sait-il lequel mettre au point en appuyant sur SUIVANT? Vérifie-t-il le «droit» puis le «bas»? Existe-t-il une fonction pour que l'id de la vue suivante soit focalisé, si l'utilisateur appuie sur la touche NEXT?
développeur android
66
android:inputType="text"

devrait apporter le même effet. Après avoir cliqué sur suivant pour amener le focus sur l'élément suivant.

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

utilisez-le en plus si vous ne voulez pas que la vue suivante se concentre

Matthias H
la source
34

ajoutez votre editText

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

ajouter une propriété à l'activité dans le manifeste

    android:windowSoftInputMode="adjustResize|stateHidden"

dans le fichier de mise en page ScrollView défini comme mise en page racine ou parent tout 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 vous ne voulez pas à chaque fois qu'il ajoute, créez un style: ajoutez un style dans values ​​/ style.xml

Style par défaut:

<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
la source
L'utilisation de android:singleLine="true"est interdite.
Praveenkumar du
18

Utilisez la ligne suivante

android:nextFocusDown="@+id/parentedit"

parenteditest l'ID du prochain EditTextà se concentrer.

La ligne ci-dessus aura également besoin de la ligne suivante.

android:inputType="text"

ou

android:inputType="number"

Merci pour la suggestion @Alexei Khlebnikov.

Spring Breaker
la source
3
Ça a marché pour moi. Avec android:inputType="text"ou android:inputType="number".
Alexei Khlebnikov
si nextFocusDown ne fonctionne pas, utilisez nextFocusForward. Cela m'a aidé
Kishan Solanki
android: nextFocusDown = "@ + id / parentedit" a fonctionné pour moi! merci
DIRTY DAVE
12
android:inputType="textNoSuggestions"
android:imeOptions="actionNext"
android:singleLine="true"
android:nextFocusForward="@+id/.."

Ajout d'un champ supplémentaire

android: inputType = "textNoSuggestions"

travaillé dans mon cas!

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

Ces trois lignes font la magie

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

Dans votre gestionnaire onEditorAction, gardez à l'esprit que vous devez renvoyer un booléen qui indique si vous gérez l'action (true) ou si vous avez appliqué une logique et souhaitez le comportement normal (false), comme dans l'exemple suivant:

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

J'ai trouvé cela lorsque je suis revenu vrai après avoir exécuté ma logique car la concentration ne bougeait pas.

user3701500
la source
3

utilisez simplement le code suivant, cela fonctionnera bien et utilisez inputType pour chaque edittext et le bouton suivant apparaîtra sur le clavier.

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

Dans certains cas, vous devrez peut-être déplacer manuellement le focus vers le champ suivant:

focusSearch(FOCUS_DOWN).requestFocus();

Vous pourriez en avoir besoin si, par exemple, vous avez un champ de texte qui ouvre un sélecteur de date au clic, et que vous souhaitez que le focus passe automatiquement au champ de saisie suivant une fois qu'une date est sélectionnée par l'utilisateur et que le sélecteur se ferme. Il n'y a aucun moyen de gérer cela en XML, cela doit être fait par programme.

flawyte
la source
2

De manière simple, lorsque vous avez peu de champs un par un:

Besoin de régler

android:maxLines="1"

android:imeOptions="actionNext"

android:inputType="" <- Définissez votre type de texte, dans les autres cas, il sera multiligne et empêchera de passer au suivant

Échantillon:

<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
la source
2

Essayez d'utiliser android: imeOptions = "actionNext" pour chaque editText dans la vue, il se concentrera automatiquement sur le prochain edittext lorsque vous cliquez sur Suivant du softKeyboard.

Kuldeep Rathee
la source
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
la source
4
Vous voudrez peut-être mettre une explication avec votre réponse pour expliquer pourquoi la vôtre est meilleure que les autres. Vous pouvez appuyer sur le bouton "modifier" pour ajouter à votre réponse.
Brian Tompsett - 汤 莱恩
1

Si vous souhaitez utiliser une multiligne EditTextavec imeOptions, essayez:

android:inputType="textImeMultiLine"
Chris
la source
1

Ajouter inputType à edittext et sur entrer, il ira au prochain edittext

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

et beaucoup plus.

inputType = textMultiLine ne passe pas au prochain edittext en entrant

Sharmad Desai
la source
1

Dans Kotlin, j'ai utilisé Bellow comme ..

  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
la source
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
la source
0

Si vous avez l'élément en mode défilement, vous pouvez également résoudre ce problème en:

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

et dans votre activité:

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
la source
0

Manière simple:

  • Déplacer automatiquement le curseur vers le prochain éditxt
  • Si edittext est la dernière entrée -> clavier caché

Ajoutez ceci au champ edittext dans le fichier .xml

android:inputType="textCapWords"
vuhoanghiep1993
la source