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>

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


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


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>

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.


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!


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"

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.


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

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.


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

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.


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

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


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

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

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"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.