372 votes

Android : afficher le clavier virtuel automatiquement lorsque le focus est sur un EditText

J'affiche une boîte de saisie en utilisant AlertDialog . Le site EditText à l'intérieur du dialogue lui-même est automatiquement mis en évidence lorsque j'appelle AlertDialog.show() mais le clavier logiciel ne s'affiche pas automatiquement.

Comment faire pour que le clavier logiciel s'affiche automatiquement lorsque la boîte de dialogue s'affiche ? (et il n'y a pas de clavier physique/matériel). De la même manière que lorsque j'appuie sur le bouton Recherche pour lancer la recherche globale, le clavier virtuel s'affiche automatiquement.

1 votes

Cela devrait se faire automatiquement, conformément à Commentaire de Ted ci-dessous. Regarde ça d'abord !

1 votes

Cette réponse est très simple et fonctionne bien : stackoverflow.com/a/8018630/89818

1 votes

317voto

yuku Points 15705

Vous pouvez créer un écouteur de mise au point sur le EditText sur le AlertDialog puis obtenir le AlertDialog 's Window . De là, vous pouvez faire apparaître le clavier souple en appelant setSoftInputMode .

final AlertDialog dialog = ...;

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

5 votes

Comment le faire en utilisant le AlertDialog.Builder ? ...final AlertDialog.Builder alert = new AlertDialog.Builder(Main.this) ;

3 votes

Cela ne fonctionne pas pour moi - Nexus S. J'ai essayé avant et après le spectacle().

0 votes

Cela ne fonctionne pas non plus pour moi. Ma boîte de dialogue contient une ListView et j'ajoute cet écouteur depuis son adaptateur.

256voto

horkavlna Points 977

Pour montrer l'utilisation du clavier :

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

Pour l'utilisation du clavier caché :

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

3 votes

Cela fonctionne particulièrement bien lorsque vous souhaitez afficher/masquer le clavier programmable en fonction de la visibilité d'une vue dans votre disposition entre VISIBLE et GONE.

43 votes

Je suggère d'utiliser le drapeau SHOW_IMPLICIT à la place, car cela signifie que le changement d'activité ou d'application masquera automatiquement le clavier comme prévu.

6 votes

@drspaceboo Utiliser SHOW_IMPLICIT ne fonctionne pas du tout pour moi, je dois utiliser SHOW_FORCED, je ne sais pas trop pourquoi...

117voto

Bao Le Points 1468

Vous pouvez demander un clavier souple juste après avoir créé le dialogue (test sur SDK - r20)

// create dialog
final AlertDialog dialog = ...; 

// request keyboard   
dialog.getWindow().setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

0 votes

Pour ceux qui se posent la question, cette méthode ne permet pas d'ouvrir le clavier souple lorsqu'un clavier matériel est attaché. Je viens de tester avec un câble USB On-The-Go. C'est parfait !

0 votes

Cela ne fait rien pour moi.

0 votes

Je n'ai pas de clavier matériel. Peut-être la configuration( ?)

26voto

Jurie Otto Points 131

J'ai trouvé cet exemple http://Android-codes-examples.blogspot.com/2011/11/show-or-hide-soft-keyboard-on-opening.html . Ajoutez le code suivant juste avant alert.show() .

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

25voto

tidbeck Points 1465

J'ai eu le même problème et je l'ai résolu avec le code suivant. Je ne sais pas comment il se comportera sur un téléphone avec un clavier matériel.

// TextEdit
final EditText textEdit = new EditText(this);

// Builder
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Enter text");
alert.setView(textEdit);

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        String text = textEdit.getText().toString();
        finish();
    }
});

alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        finish();
    }
});

// Dialog
AlertDialog dialog = alert.create();
dialog.setOnShowListener(new OnShowListener() {

    @Override
    public void onShow(DialogInterface dialog) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(textEdit, InputMethodManager.SHOW_IMPLICIT);
    }
});

dialog.show();

0 votes

C'est dans le Classe de dialogue Niveau 8 de l'API.

0 votes

A dû être retiré plus tard :/

0 votes

@Xylian c'est toujours dans la documentation Dialog.setOnShowListener()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X