web-dev-qa-db-fra.com

Afficher le clavier virtuel pour la boîte de dialogue

J'affiche une boîte de dialogue avec une vue edittext. Cependant, le clavier logiciel ne s'ouvre que si l'utilisateur appuie à l'intérieur de la vue d'édition. J'ai donc essayé d'appeler un InputMethodManager avec le code suivant.

InputMethodManager imm =
 (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(dialogField,0);

Le dialogField est le champ de saisie. Cependant, quand dois-je faire exactement cela? Je l'ai essayé dans la méthode onStart () de la boîte de dialogue, mais rien ne se passe. J'ai également essayé de demander la mise au point pour dialogField auparavant, mais cela ne change rien.

J'ai aussi essayé ce code

dialogField.setOnFocusChangeListener(new View.OnFocusChangeListener()
{
    public void onFocusChange (View v, boolean hasFocus)
    {
        if (hasFocus)
        {
            Main.log("here");
            dialogInput.getWindow().setSoftInputMode(
              WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            /*
                InputMethodManager mgr =
                  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                mgr.showSoftInput(dialogField,0);
            */
        }
    }
});

dans les deux versions. Mais aucun clavier logiciel ne souhaite apparaître. Le Main.log est juste un journal, ce qui me montre que la fonction est réellement appelée. Et oui, ça s'appelle.

J'ai pu obtenir le clavier avec l'indicateur SHOW_FORCED avant l'ouverture de la boîte de dialogue. Mais il ne fermera pas à la sortie. Et je ne peux le faire qu'avant d'afficher la boîte de dialogue. Dans tous les rappels, cela ne fonctionne pas non plus.

66
Rene

Super question, j'essayais de le faire aussi et j'ai trouvé une solution.

Utilisation de la classe de générateur de boîte de dialogue AlertDialog.Builder vous devrez appeler la boîte de dialogue comme ceci:

AlertDialog.Builder builder = new AlertDialog.Builder();
AlertDialog dialog;

builder.set...

dialog = builder.create();
dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();

CA marchait bien pour moi.

Remarque: vous devez import Android.view.WindowManager.LayoutParams; pour la valeur constante.

167
SparK
 AlertDialog dialog = new AlertDialog.Builder(this).create();
    dialog.show();
    Window window = dialog.getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
5
Deli Coder