lorsque vous utilisez AlertDialog.Builder avec EditText, le clavier virtuel ne s'affiche pas

117

J'utilise AlertDialog.Builder pour créer une zone de saisie, avec EditText comme méthode d'entrée.

Malheureusement, le clavier virtuel ne s'affiche pas, bien que le EditText soit au point, sauf si vous le touchez à nouveau explicitement.

Y a-t-il un moyen de le forcer à éclater?

J'ai essayé ce qui suit, après le (AlertDialog.Builder) .show (); mais en vain.

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);

Quelqu'un peut-il aider?

Merci!!

niros
la source
1
veuillez formater votre code source.
philipp
Ensuite, je vous upvote aussi :) J'ai eu le même problème de recherche pendant plusieurs heures et la dernière réponse de grine4ka fonctionne très bien
philipp

Réponses:

222

J'ai fait une telle chose

AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();

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

dialog.show();
grine4ka
la source
3
Merci beaucoup. Je cherche depuis un moment maintenant et c'est comme ça que tu veux aller. Toutes les OnFocusChangeListenerapproches me paraissent beaucoup et causent des problèmes. Vous devez créer le à AlertDialogpartir du AlertDialog.Builder!
philipp
Est-ce vraiment une solution? Cela force simplement le clavier à afficher, qu'il y ait un champ de saisie ou non, que le champ de saisie ait le focus ou non, non? =)
Ted
@Ted vous avez raison, ce n'est pas la vraie solution, mais cela fonctionne.J'ai essayé de faire une telle chose s'il n'y a pas d'edittext dans la boîte de dialogue et que le clavier logiciel n'apparaît pas.
grine4ka
1
J'arrive en fait à "le résoudre" (solution de contournement). J'utilise le setOnFocusChangeListener pour le EditText, et dans onFocusChange si je vérifie s'il a le focus (le var "hasFocus") et si oui, je fais getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Ted
1
Remarque: pour que cela fonctionne, vous devez placer la setSoftInputModeligne avant dialog.show() ou cela ne fonctionnera pas. +1 pour la solution correcte simple btw
Spikatrix
30

J'ai réussi à le résoudre comme ceci:

Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Alex Fragotsis
la source
Cela a fonctionné pour moi.
Ahmad Daudu Sulaiman
23

J'ai découvert que le même code fonctionne correctement sur la tablette, le clavier apparaît, mais sur le téléphone, ce n'est pas le cas, donc la recherche plus approfondie semble indiquer l'option «ajuster».

J'utilise ceci, je me sens beaucoup plus propre.

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();
Phuah Yee Keat
la source
Merci. C'est mieux que d'utiliser SOFT_INPUT_STATE_ALWAYS_VISIBLE. Comme cela SOFT_INPUT_STATE_ALWAYS_VISIBLEva bloquer les composants de l'interface utilisateur du dialogue, où il est SOFT_INPUT_ADJUST_RESIZEpossible de redimensionner et de «pousser» la boîte de dialogue.
Cheok Yan Cheng
10

Dans mon cas, la seule façon dont j'ai pu afficher le clavier lorsque la boîte de dialogue était affichée était d'ajouter à mon DialogFragment:

@Override
public void onResume() {
    super.onResume();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    myEditText.requestFocus();
}

Notez SOFT_INPUT_STATE_ALWAYS_VISIBLE au lieu de SOFT_INPUT_STATE_VISIBLE .

De la documentation:

int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.
vovahost
la source
C'était la seule solution qui fonctionnait pour moi et j'en avais essayé beaucoup. Le mien était une construction de dialogfragment à partir du générateur d'alertdialog. L'important semblait être de placer le code ci-dessus dans onResume (). Partout ailleurs, cela n'a pas fonctionné!
user960914
6

Lorsque vous appelez showDialog pour afficher un dialogue créé à l'aide d'AlertDialog dans onCreateDialog

Vous devriez mettre le code ici

    @Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
    TextView editText=(TextView) dialog.findViewById(R....);

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

}
user590912
la source
5

Une bien meilleure solution est donnée ici .

dialog.getWindow().clearFlags(
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

Aucune solution de contournement. EditTextse comporte comme prévu.

sulai
la source
Celui-ci a fonctionné pour moi, l'autre solution apportait le focus mais le clavier n'était pas affiché.
Akshay
2
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);
Mohammed Shoeb
la source
1

Cela a déjà été répondu ici . L'utilisation d'un OnFocusChangeListener a fonctionné pour moi.

dhaag23
la source
La question demande comment définir le mode de saisie logicielle pour un objet AlertDialog.Builder, mais le thread auquel vous faites référence donne un exemple d'utilisation d'un objet AlertDialog. Si j'essaie d'utiliser le code suggéré (en utilisant alert.getWindow (). SetSoftInputMode (...) dans OnFocusChangeListener) Eclipse objets que la méthode getWindow () n'est pas définie pour le type AlertDialog.Builder. Pouvez-vous m'aider à résoudre ce problème, s'il vous plaît?
prepbgg
1

Dans mon cas, le SoftInputMode ne s'affichait pas lorsque je l'ai défini, ce qui était avant d'afficher la boîte de dialogue (après sa création). Le code ci-dessous a fonctionné pour moi où j'ai défini le SoftInputMode après avoir affiché la boîte de dialogue.

Kotlin:

val dialog = MaterialAlertDialogBuilder(context) // Other builder code
                .create()
dialog.show()
dialog.window?.apply { // After the window is created, get the SoftInputMode
    clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}

Java:

AlertDialog dialog = MaterialAlertDialogBuilder(getContext()) // Other builder code
                .create();
dialog.show();
Window window = dialog.getWindow();
if(window != null){ // After the window is created, get the SoftInputMode
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

J'espère que cela aidera tous ceux qui avaient le même problème que moi.

AurumTechie
la source
0

Essayez ça, ça marche pour moi

Si vous souhaitez afficher le clavier virtuel:

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(input.getWindowToken(), 0);

Et si vous voulez le cacher:

  InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
Yogesh Rathi
la source
0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
TonnyTao
la source
1
Il est préférable d'inclure un contexte / une explication avec du code car cela rend la réponse plus utile pour l'OP et pour les futurs lecteurs.
EJoshuaS - Réintégrer Monica le
0

Ce problème se produit lorsque EditText est ajouté après l'appel d'AlertDialog.onCreate.

https://developer.android.com/reference/androidx/appcompat/app/AlertDialog.Builder

La classe AlertDialog se charge de définir automatiquement android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM pour vous en fonction du fait que les vues de la boîte de dialogue retournent true à partir de View.onCheckIsTextEditor ().

Vous devez effacer l'indicateur FLAG_ALT_FOCUSABLE_IM.

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

Étant donné que AlertDialog.show est appelé dans DialogFragment.onStart, vous pouvez insérer le code dans DialogFragment.onStart.

@Override
public void onStart() {
    super.onStart();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

Ou vous pouvez utiliser Dialog.setOnShowListener si vous n'utilisez pas de DialogFragment.

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
Parc Sungsuh
la source