Comment afficher le clavier logiciel lorsque edittext est focalisé


461

Je souhaite afficher automatiquement le clavier virtuel lorsqu'un EditTextest ciblé (si l'appareil n'a pas de clavier physique) et j'ai deux problèmes:

  1. Lorsque mon Activityest affiché, mon EditTextest focalisé mais le clavier n'est pas affiché, je dois cliquer à nouveau dessus pour afficher le clavier (il doit être affiché lorsque mon Activityest affiché).

  2. Et quand je clique sur terminé sur le clavier, le clavier est rejeté mais le EditTextreste concentré et y ne veut pas (car ma modification est terminée).

Pour reprendre, mon problème est d'avoir quelque chose de plus comme sur l'iPhone: qui garde la synchronisation du clavier avec mon EditTextétat (focalisé / non focalisé) et bien sûr ne présente pas de clavier logiciel s'il y en a un physique.


J'ai juste un EditText de base comme: <EditText android: id = "@ + id / myEditText" android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: imeOptions = "actionDone" /> Et sur mon activité, j'ai ceci: EditText editTxt = (EditText) findViewById (R.id.myEditText); editTxt.requestFocus ();
Ludovic Landry le

2
Cela m'a aidé mieux que n'importe quelle réponse dans cet article: stackoverflow.com/a/2418314/1491212
Armel Larcier

Réponses:


629

Pour forcer l'affichage du clavier virtuel, vous pouvez utiliser

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
yourEditText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

Et pour supprimer la mise au point EditText, malheureusement, vous devez avoir un mannequin Viewpour saisir la mise au point.

J'espère que ça aide


Pour le fermer, vous pouvez utiliser

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);

Cela fonctionne pour l'utiliser dans une boîte de dialogue

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}

2
Si je fais cela, le clavier virtuel est affiché lorsque l'activité apparaît (c'est bien) mais lorsque mon focus quitte le EditText et va à un bouton par exemple, le clavier reste (c'est mauvais).
Ludovic Landry

157
Ne fonctionne pas pour moi avec un EditText dans une boîte de dialogue qui a déjà le focus. Pas certain de pourquoi.
Matthias

10
@AbdellahBenhammou, peut-être que vous effectuez un appel requestFocus sur votre texte de modification avant d'afficher l'entrée logicielle pourrait résoudre votre problème. Ça l'a fait pour moi.
r1k0

18
@AbdellahBenhammou, faites-le dans onCreate () de votre DialogFragment: getDialog (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Phillip

22
Fonctionné uniquement en conjonction avec yourEditText.requestFocus()comme décrit ici: stackoverflow.com/questions/8991522/…
Vivek Pandey

231

J'ai eu le même problème. Immédiatement après le changement de VISIBILITÉ de editText de GONE à VISIBLE, j'ai dû régler la mise au point et afficher le clavier virtuel. J'ai réalisé cela en utilisant le code suivant:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

Cela fonctionne pour moi avec un retard de 100 ms, mais a échoué sans aucun retard ou avec seulement un retard de 1 ms.

La partie commentée du code montre une autre approche, qui ne fonctionne que sur certains appareils. J'ai testé les versions OS 2.2 (émulateur), 2.2.1 (appareil réel) et 1.6 (émulateur).

Cette approche m'a sauvé beaucoup de douleur.


48
Je ne savais pas que quelque chose pouvait être si moche et si beau à la fois. Merci beaucoup!
mkerley

15
@jellyfish cela simule un tap sur le EditText. Pour ceux qui lisent ceci, au lieu d'en créer un nouveau, Handlervous pouvez également utiliser la View.postDelayed()méthode sur le yourEditTextwidget lui-même.
Tony Chan

5
Ceci est un hack - une bien meilleure solution par David Chandler.
Ben Bederson

4
Si la solution de David Chandler fonctionne sur toutes les versions / tous les appareils Android et dans le cas où VISIBILITY vient d'être changé de GONE à VISIBLE, alors OUI - vous devez utiliser sa solution à la place.
Mike Keskinov le

3
D'accord. Connaissez-vous une meilleure solution qui fonctionne sur toutes les versions d'Android?
Mike Keskinov

162

Pour faire apparaître le clavier, utilisez

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

Cette méthode est plus fiable que d'appeler directement InputMethodManager.

Pour le fermer, utilisez

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

12
Quelqu'un peut-il expliquer pourquoi cela est plus fiable que d'invoquer directement InputMethodManager? (D'une part, cela ne fonctionne pas, contrairement à la solution de raukodraug.)
Matthew Quiros

5
Ça ne marche pas non plus pour moi. Travailler dans Android 2.3.5. La solution de raukodraug fonctionne pour moi. Recherche de dépendance de version mais impossible d'en trouver une.
Hugo Logmans

2
Cela a fonctionné pour moi dans Android 4.4.2. La méthode InputMethodManager choisie comme solution pour ce message n'a pas fonctionné pour moi.
Phil

après avoir utilisé la méthode dans la réponse, j'ai ajouté ceci et cela a fonctionné, mais sans cela, cela n'a pas fonctionné. Thanx
Manny265

2
N'a pas fonctionné pour moi dans Android 4.4.2. Il montre le clavier mais ne l'a pas caché.
John J Smith

87

Lorsque rien d'autre ne fonctionne, forcez-le à s'afficher :

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

Et puis plus tard, si vous souhaitez le fermer, dans onPause () par exemple, vous pouvez appeler:

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

4
Vous aviez raison, @Bolling! Quand rien d'autre n'a fonctionné, votre code m'a sauvé. Merci!
Willian Paixao

3
Votre code était le seul à avoir fonctionné pour moi, et j'ai essayé toutes les solutions sur cette page! Merci beaucoup!
Mattia Ruggiero

4
ne forcez pas. dans certains cas, lorsque vous passez du premier plan à l'arrière-plan, le clavier reste là car vous l'avez forcé. c'est un problème de fragmentation mais je l'ai vu sur des duos Samsung.
j2emanue

J'ai généralement toujours du code pour fermer le clavier onPause () car je l'ai vu se bloquer même si vous ne l'avez pas forcé.
Bolling

Cela a fonctionné, mais lors du passage aux autres écrans, il reste ouvert
Sithu

75

Le code suivant est pillé à partir du code source de Google 4.1 pour SearchView. Semble fonctionner, très bien sur les versions moindres d'Android.

private Runnable mShowImeRunnable = new Runnable() {
    public void run() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.showSoftInput(editText, 0);
        }
    }
};

private void setImeVisibility(final boolean visible) {
    if (visible) {
        post(mShowImeRunnable);
    } else {
        removeCallbacks(mShowImeRunnable);
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindowToken(), 0);
        }
    }
}

Ensuite, en outre, le code suivant doit être ajouté lors de la création du contrôle / de l'activité. (Dans mon cas, c'est un contrôle composite, plutôt qu'une activité).

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});

Merci! Cela fonctionne incroyablement bien. Et c'est la solution avec laquelle je suis plus à l'aise avec toutes les réponses et les sujets que j'ai lus sur cette question.
Rui

37
:-D setImeVisibility(hasFocus)?
Matthias

J'ai essayé cette méthode car je "roulais ma propre vue de recherche" (je ne voulais pas avoir à le faire mais il y avait des raisons). Cela a fonctionné pour moi, sauf lors du lancement de l'activité. J'ai ajouté android: windowSoftInputMode = "alwaysVisible" à l'activité et j'avais déjà appelé requestFocus () sur le texte d'édition. Fonctionne comme un champion.
javahead76

Une idée de la nécessité de supprimer les rappels (mShowImeRunnable)? Je pensais qu'une fois que l'exécutable est choisi pour s'exécuter de la file d'attente, il sera également supprimé de la file d'attente en même temps?
Cheok Yan Cheng

1
Après avoir essayé plusieurs variantes, c'était la seule qui fonctionnait de manière cohérente pour moi (Android 4.42). Thx
John J Smith

34

android:windowSoftInputMode="stateAlwaysVisible" -> dans le fichier manifeste.

edittext.requestFocus(); -> en code.

Cela ouvrira le clavier logiciel sur lequel le texte d'édition a le focus de demande lorsque l'activité apparaît.


2
Cela ouvre le clavier lors de la création d'activité.
jusqu'au

ne répond pas à la question, mais m'a aidé :)
S.Thiongane

ouvre la clé sans requestfocus dans l'api 22
David

Fonctionne bien pour mon cas. Je me demande pourquoi l'attribut focus de requête juste à partir du xml doit également être mentionné dans le manifest!
sud007

30

J'ai eu récemment de la chance dans certains cas simples avec le code ci-dessous. Je n'ai pas terminé tous les tests mais ...

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Et hop, le clavier apparaît.


Pour mon cas, j'avais un bouton pour ajouter des informations facultatives. Dans le gestionnaire button.onClick, le code ci-dessus a été ajouté pour forcer le clavier virtuel à apparaître pour la saisie des informations facultatives. Droid 2.2.2
Dent

c'est une bonne solution mais n'oubliez pas que vous devez créer un objet MotionEvent et appeler recycle () dessus après utilisation, pour être réutilisé par un appelant ultérieur.
jimbob

Vous n'avez besoin que d'un dispatchTouchEvent () avec ACTION_UP comme argument.
Mohammed Junaid

15

Vous pouvez essayer de forcer le clavier virtuel à apparaître, cela fonctionne pour moi:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

1
Cela fonctionne pour moi ... J'avais essayé ces InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.showSoftInput (nom, inputMethodManager.SHOW_IMPLICIT); ou getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); mais aucun d'eux ne fonctionnait.
Günay Gültekin

10

Parfois, la réponse de raukodraug ne fonctionne pas. Je l'ai fait de cette manière avec quelques essais et erreurs:

public static void showKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
}

Et la partie EditText :

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(getActivity());
            } else {
                showKeyboard(getActivity());
            }
        }
    });

1
C'est la seule solution qui a fonctionné pour moi sur Android 5
user1021430

10

Pour masquer le clavier, utilisez celui-ci:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

et pour afficher le clavier:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Pour un DialogFragment, vous pouvez appeler cela dans une substitution onStart()et vous pouvez utiliser getDialog().getWindow()comme alternative à getActivity().getWindow().
Mr-IDE du

10

Et pour Kotlin, utilisez simplement ces extensions:

fun EditText.showKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

Exactement ce que je cherchais.
lasec0203

8

Pour fragment, bien sûr son fonctionnement:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

7

showSoftInput ne fonctionnait pas du tout pour moi.

J'ai pensé que je devais définir le mode d'entrée: (ici dans le composant Activity du manifeste)

android:windowSoftInputMode="stateVisible" 

6

Croyez ou non mon problème avec le clavier logiciel a été résolu lorsque j'ai découvert que les animations d'activités pouvaient désactiver le clavier logiciel. Lorsque vous appelez l'intention avec le

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

et

overridePendingTransition(0, 0);

Il peut masquer le clavier logiciel et il n'y a aucun moyen de le montrer.


6

J'ai eu le même problème dans diverses situations différentes, et les solutions que j'ai trouvées fonctionnent dans certains mais ne fonctionnent pas dans d'autres alors voici une solution de combinaison qui fonctionne dans la plupart des situations que j'ai trouvées:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}

6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});

6

J'ai tout combiné ici et pour moi ça marche:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

6

Ça a marché pour moi. Vous pouvez également essayer d'afficher le clavier:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

5

extrait de code . . .

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
    View rootView = ((Activity) activityContext)
            .findViewById(android.R.id.content).getRootView();

    imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}

public void showKeyboard(Context activityContext, final EditText editText){

    final InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (!editText.hasFocus()) {
        editText.requestFocus();
    }

    editText.post(new Runnable() {
        @Override
        public void run() {
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        }
    });
}

5

Kotlin extension pour afficher le clavier au point.

Il s'agit d'une combinaison de réponses précédentes, qui étaient trop longues ou incomplètes.

Cette extension publie un exécutable dans la file d'attente des messages qui montre le clavier virtuel après avoir demandé le focus:

fun View.showSoftKeyboard() {
    post {
        if (this.requestFocus()) {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
        }
    }
}

Appelez-le de n'importe quelle vue lorsque cela est nécessaire par la suite:

editText.showSoftKeyboard()

4

il suffit d'ajouter android: windowSoftInputMode = "stateHidden" dans le fichier manifeste ...


4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

4

À l'intérieur de votre manifeste:

android:windowSoftInputMode="stateAlwaysVisible"- clavier initialement lancé. android:windowSoftInputMode="stateAlwaysHidden" - clavier initialement caché.

J'aime aussi l'utiliser "adjustPan"parce que lorsque le clavier se lance, l'écran s'ajuste automatiquement.

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>

4

Ajoutez simplement cette ligne dans votre vue EditText:

android:isScrollContainer="true"

et TADA - le clavier a commencé à apparaître automatiquement!

J'ai eu un problème similaire et j'ai découvert cette solution simple et étrange.

Comme déjà mentionné ici par user3392439, l'apparence du clavier lors de la mise au point est en quelque sorte étrangement liée à la présence du composant de défilement dans le fichier XML.

Même la présence d' une autre vue EditText qui comprend la ligne susmentionnée dans le même XML fait apparaître le clavier, peu importe lequel des EditTexts est actuellement focalisé.

Si vous avez au moins une vue visible comprenant un composant de défilement dans votre fichier XML - le clavier apparaîtra automatiquement sur le focus.

Si aucun défilement - alors vous devez cliquer sur EditText pour faire apparaître le clavier.


C'est très étrange mais cela fonctionne définitivement - j'essayais de le faire requesFocus()depuis un gestionnaire de clics et c'est la seule façon autre qu'un showSoftInput SHOW_FORCED explicite
attiré

Putain de merde, merci mec. Je ne sais pas pourquoi cela fonctionne, mais je l'ai testé sur 8 appareils de différents fabricants et cela a fonctionné à chaque fois!
Antonio Vlasic

3

Toutes les solutions données ci-dessus ( interaction InputMethodManager dans l' écouteur OnFocusChangeListener.onFocusChange attaché à votre EditText fonctionne correctement si vous avez une seule modification dans l'activité.

Dans mon cas, j'ai deux modifications.

 private EditText tvX, tvY;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 tvX.setOnFocusChangeListener(this);
    tvY.setOnFocusChangeListener(this);

@Override
public void onFocusChange(View v, boolean hasFocus) {       
    InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(tvX.hasFocus() || tvY.hasFocus()) {            
        imm.showSoftInput(v, 0);            
    } else {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);         
    }       
};

J'ai observé que onFocusChange est déclenché pour tvX avec hasFocus = true (clavier illustré) mais ensuite pour tvY avec hasFocus = true (clavier masqué). Au final, aucun clavier n'était visible.

La solution générale devrait avoir une déclaration correcte si "afficher le clavier si le texte EditText a le focus"


3

Dans votre section onResume () de l'activité, vous pouvez appeler la méthode bringKeyboard ();

 onResume() {
     EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
     bringKeyboard(yourEditText);
 }


  protected boolean bringKeyboard(EditText view) {
    if (view == null) {
        return false;
    }
    try {
      // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
        String value = view.getText().toString();
        if (value == null) {
            InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            return true;
        }
    } catch (Exception e) {
        Log.e(TAG, "decideFocus. Exception", e);
    }
    return false;
  }

C'est quoi WidgetUtils.showKeyboard? C'est l'élément le plus important ici.
TWiStErRob

2

Aucune des réponses n'a fonctionné pour moi. Voici un moyen simple.

searchEditText.setVisibility(View.VISIBLE);
                final Handler handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        searchEditText.requestFocus();
                    }
                }, 400);

Nous venons de retarder la méthode requestFocus () de 400 ms.


Merci beaucoup, il a besoin d'un peu de retard pour l'affichage du clavier ...
hkh114

1

J'ai découvert un comportement étrange, car dans l'une de mes applications, le clavier virtuel s'affichait automatiquement en entrant dans l'activité (il y a un editText.requestFocus () dans onCreate).

En creusant plus loin, j'ai découvert que c'était parce qu'il y avait un ScrollView autour de la mise en page. Si je supprime ScrollView, le comportement est tel que décrit dans l'énoncé du problème d'origine: ce n'est que lorsque vous cliquez sur le texte d'édition déjà concentré que le clavier virtuel s'affiche.

Si cela ne fonctionne pas pour vous, essayez de mettre en ScrollView - il est inoffensif de toute façon.


1

J'ai eu un problème similaire lors de l'utilisation des animations de vue . J'ai donc mis un écouteur d'animation pour m'assurer d' attendre la fin de l'animation avant d'essayer de demander un accès au clavier sur l'edittext affiché.

    bottomUp.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            if (textToFocus != null) {
                // Position cursor at the end of the text
                textToFocus.setSelection(textToFocus.getText().length());
                // Show keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT);
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });

1

Je suis d'accord avec raukodraug à cet effet en utilisant dans un swithview vous devez demander / effacer le focus comme ceci:

    final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    final View btn = viewSwitcher.findViewById(R.id.address_btn);
    final View title = viewSwitcher.findViewById(R.id.address_value);

    title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewSwitcher.showPrevious();
            btn.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // EditText affiche le titre evenement click
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btn.clearFocus();
            viewSwitcher.showNext();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
            // Enregistre l'adresse.
            addAddress(view);
        }
    });

Cordialement.

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.