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.

Ludovic Landry
la source
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);
}
raukodraug
la source
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.

Mike Keskinov
la source
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);
David Chandler
la source
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);
Bolling
la source
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);
    }
});
Robin Davies
la source
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.

gorenikhil33
la source
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.

Bosse
la source
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);
Vadim Zin4uk
la source
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());
            }
        }
    });
Xieyi
la source
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);
Mubashar
la source
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)
}
bitvale
la source
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);
Arish Khan
la source
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" 
vincebodi
la source
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.

étincelle
la source
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);
                }
            });
        }
    }
}
n0sferat0k
la source
6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});
Client
la source
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();
    }
}
lxknvlk
la source
6

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
Tarit Ray
la source
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);
        }
    });
}
Jongz Puangput
la source
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()
Alex Burdusel
la source
4

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

Prakash Gavade
la source
4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
XXX
la source
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"/>
Md Imran Choudhury
la source
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.

Waldmann
la source
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"

Bartosz Bilicki
la source
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;
  }
Vikas
la source
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.

Satyajit Das
la source
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.

user3392439
la source
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) {
        }
    });
Benjamin Piette
la source
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.

Jean-Luc Barat
la source