web-dev-qa-db-fra.com

Comment redimensionner AlertDialog sur l'écran du clavier

J'ai une boîte AlertDialog avec environ 10 contrôles (texte et TextView) dessus. Ces contrôles sont dans un ScrollView avec AlertDialog, en plus j'ai 2 boutons positifs et négatifs. Le problème que j'ai, c'est lorsque le clavier virtuel apparaît, les deux boutons sont cachés derrière le clavier.

Je cherchais quelque chose comme la fonction redessiner sur ma vue intérieure ou la boîte de dialogue. Ci-dessous, la capture d'écran de ce dont je parle.

enter image description here

33
Sanj

Si votre boîte de dialogue était une activité utilisant l'un des thèmes de boîte de dialogue, vous pouvez affecter ce comportement en définissant l'indicateur adjustResize pour le paramètre windowSoftInputMode de l'activité.

J'utilise:

Android:windowSoftInputMode="adjustResize|stateHidden"

Je pense que vous pouvez toujours utiliser ce drapeau avec des dialogues réguliers, mais je ne sais pas comment l'appliquer. Vous devrez peut-être créer votre AlertDialog avec un thème personnalisé qui hérite du bon thème parent et définit également cet indicateur, ou vous devrez peut-être utiliser ContextThemeWrappers et d'autres éléments.

Ou peut-être pouvez-vous simplement utiliser Window # setSoftInputMode .

alertDialog.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
99
nmr

J'ai trouvé le meilleur moyen de gérer cela. Parce que c'est une boîte de dialogue, donc le code

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

ne fonctionne pas très bien.

Outre ce code, vous devez définir un style de dialogue pour cette boîte de dialogue. Le style devrait aimer ci-dessous:

<style name="DialogStyle" parent="@Android:style/Theme.Black.NoTitleBar.Fullscreen">
    <item name="Android:windowFullscreen">false</item>
    ......
    ......
</style>

AVIS que l'attribut parent est Theme.Black.NoTitleBar.Fullscreen comme le style d'une activité. et l'attribut Android:windowFullScreen devrait être false.

Maintenant, la boîte de dialogue sera redimensionnée lorsque le clavier virtuel bascule.

15
Nick

Rien n'a fonctionné pour moi sauf adjustPan

selon la documentation

La fenêtre principale de l'activité n'est pas redimensionnée pour faire de la place au clavier virtuel. Au contraire, le contenu de la fenêtre est automatiquement balayé afin que le focus actuel ne soit jamais masqué par le clavier et que les utilisateurs puissent toujours voir ce qu'ils tapent. Ceci est généralement moins souhaitable que le redimensionnement, car l'utilisateur peut avoir besoin de fermer le clavier virtuel pour accéder et interagir avec les parties masquées de la fenêtre.

Utilisez-le simplement dans votre méthode onCreate () ou onCreateView () comme:

getDialog().getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

Ou mettez simplement Android:windowSoftInputMode="adjustPan" en manifeste pour l'Activiry dans lequel nous jouons avec des dialogues

et utilise Android:windowSoftInputMode="adjustResize|stateHidden" dans chaque edittext, ce qui aidera l'utilisateur à naviguer facilement vers la zone de texte suivante.

Point à retenir

N'utilisez jamais MATCH_PARENT pour rendre la boîte de dialogue en plein écran car adjustPan ne fonctionnera pas ici. Si quelqu'un veut que la boîte de dialogue s'adapte à l'écran, utilisez simplement des points jusqu'à 0,96 (pas plus que cela) pour la hauteur, afin que le clavier atteigne correctement l'edittext. J'ai aimé ci-dessous:

@Override
public void onStart()
{
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        //int height = ViewGroup.LayoutParams.MATCH_PARENT;
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        Display display = getActivity().getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        //int width = (int)(size.x * 0.96);
        int h = (int)(size.y * 0.96);

        dialog.getWindow().setLayout(width, h);
    }
}

Regardez, si je vais utiliser la hauteur totale (MATCH_PARENT), alors soft_keyboard va écraser la boîte de dialogue. Mais si j'utilise des points pour la hauteur (ici 0,96 qui est presque proche de match_parent), alors cela fonctionnera correctement.

J'espère que cela aidera quelqu'un :)

3
Ranjit

vous n'avez peut-être pas besoin de redimensionner la boîte de dialogue

ajouter Android: imeOptions = "actionNext" à EditText (tout sauf le dernier) (il ajoutera le bouton "Next" au clavier - aller au prochain EditText)

et ajouter Android: imeOptions = "actionDone" pour durer EditText (bouton "Done" - cacher le clavier)

l'utilisateur doit maintenant pouvoir cliquer sur les boutons

si vous créez des zones de texte dans du code, utilisez la fonction EditText # setImeOptions

HTH

1
Selvin

Êtes-vous obligé de l'avoir comme popup? La fenêtre contextuelle semble si grande que vous souhaiterez peut-être simplement l'avoir comme une activité distincte. En général, les fenêtres contextuelles sont utilisées pour fournir une brève question ou une déclaration avec quelques options, pas un formulaire de saisie de données complet. Comme vous ne pouvez pas voir grand-chose derrière la grande fenêtre contextuelle, vous n'exposez de toute façon aucun contrôle sous-jacent.

1
Stealth Rabbi

pour afficher immédiatement le clavier et ajuster la taille:

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 | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        }
    }
});
0
Samad