40 Stimmen

Wie man AlertDialog beim Anzeigen der Tastaturgröße anpasst

Ich habe ein AlertDialog-Feld mit ungefähr 10 Steuerelementen (Text und TextView) darauf. Diese Steuerelemente befinden sich in einem ScrollView mit AlertDialog, außerdem habe ich 2 positive und negative Schaltflächen. Das Problem, das ich habe, ist, dass die beiden Schaltflächen hinter der Tastatur versteckt sind, wenn sie angezeigt wird.

Ich habe nach etwas wie einer Neuzuweisungsfunktion auf meinem inneren View oder dem Dialogfeld gesucht. Unten finden Sie einen Screenshot von dem, worüber ich spreche.

Bildbeschreibung hier eingeben

118voto

nmr Punkte 16230

Wenn Ihr Dialog eine Aktivität mit einem der Dialog-Themen war, könnten Sie dieses Verhalten beeinflussen, indem Sie die adjustResize-Flagge für den windowSoftInputMode-Parameter der Aktivität setzen.

Ich benutze:

android:windowSoftInputMode="adjustResize|stateHidden"

Ich denke, Sie können diese Flagge immer noch bei normalen Dialogen verwenden, aber ich bin mir nicht sicher, wie man sie anwendet. Möglicherweise müssen Sie Ihren AlertDialog mit einem benutzerdefinierten Thema erstellen, das das richtige übergeordnete Thema erbt und auch diese Flagge setzt, oder Sie müssen ContextThemeWrapper und ähnliches verwenden.

Oder vielleicht können Sie einfach Window#setSoftInputMode verwenden.

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

18voto

Nick Punkte 1604

Ich habe einen besseren Weg gefunden, damit umzugehen. Weil dies ein Dialog ist, funktioniert der folgende Code nicht sehr gut.

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

Neben diesem Code müssen Sie einen Dialogstil für diesen Dialog festlegen. Der Stil sollte wie folgt aussehen:

    <item name="android:windowFullscreen">false</item>
    ......
    ......

BEACHTEN SIE, dass das Attribut parent Theme.Black.NoTitleBar.Fullscreen ist wie der Stil einer Aktivität. Und das Attribut android:windowFullScreen sollte false sein.

Jetzt wird der Dialog beim Umschalten der Bildschirmtastatur neu dimensioniert.

4voto

Ranjit Punkte 4985

Nichts hat für mich funktioniert, außer adjustPan

gemäß der Dokumentation

Das Hauptfenster der Aktivität wird nicht vergrößert, um Platz für die Bildschirmtastatur zu schaffen. Stattdessen wird der Inhalt des Fensters automatisch verschoben, damit der aktuelle Fokus niemals von der Tastatur verdeckt wird und Benutzer immer sehen können, was sie eingeben. Dies ist im Allgemeinen weniger wünschenswert als das Vergrößern, da der Benutzer möglicherweise die Bildschirmtastatur schließen muss, um auf verdeckte Teile des Fensters zuzugreifen und mit ihnen zu interagieren.

Also verwenden Sie es einfach in Ihrem onCreate() oder onCreateView() Methode wie folgt:

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

Oder setzen Sie einfach android:windowSoftInputMode="adjustPan" im Manifest für die Aktivität, in der wir mit Dialogen arbeiten

und verwenden Sie android:windowSoftInputMode="adjustResize|stateHidden" in jedem EditText, was dem Benutzer hilft, einfach zum nächsten Textfeld zu navigieren.

Zu beachten

Verwenden Sie niemals MATCH_PARENT, um den Dialog im Vollbildmodus anzuzeigen, da adjustPan hier nicht funktioniert. Wenn jemand den Dialog passend zum Bildschirm machen möchte, verwendet man einfach Punkte bis 0,96 (nicht mehr), für die Höhe, damit die Tastatur ordnungsgemäß zum EditText gelangt. Wie ich es gemacht habe:

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

Sieh mal, wenn ich die Gesamthöhe (MATCH_PARENT) verwenden würde, würde die Bildschirmtastatur den Dialog zusammendrücken. Aber wenn ich Punkte für die Höhe verwende (hier 0,96, was fast an match_parent herankommt), funktioniert es ordnungsgemäß.

Hoffentlich hilft es jemandem :)

2voto

Selvin Punkte 6546

Vielleicht müssen Sie den Dialog nicht neu dimensionieren

Fügen Sie android:imeOptions="actionNext" zu EditText (alle außer dem letzten) hinzu (dadurch wird die Schaltfläche "Weiter" der Tastatur hinzugefügt - zum nächsten EditText wechseln)

und fügen Sie dem letzten EditText android:imeOptions="actionDone" hinzu ("Fertig" - Tastatur ausblenden)

Jetzt sollte der Benutzer in der Lage sein, auf die Schaltflächen zu klicken

Wenn Sie Textfelder im Code erstellen, verwenden Sie die Funktion EditText#setImeOptions

HTH

1voto

yeonseok.seo Punkte 2681

Für diejenigen, die sich in derselben Situation wie ich befinden.

In meinem Fall bestand das Problem darin, dass die Aktivität diese Attribute im Style hatten

   <item name="android:windowTranslucentStatus">true</item>
   <item name="android:windowTranslucentNavigation">true</item>

Wenn windowTranslucentStatus und windowTranslucentNavigation beide true sind, wird die Tastatur angezeigt, da sie den Dialog überlagert.

Also setze ich diese Werte auf false, nur für MaterialAlertDialog. (vielleicht AlertDialog oder Dialog in Ihrem Fall)

   <item name="android:windowTranslucentStatus">true</item>
   <item name="android:windowTranslucentNavigation">true</item>
   <item name="materialAlertDialogTheme">@style/TranslucentMaterialAlertDialogTheme</item>

   <item name="android:windowTranslucentStatus">false</item>
   <item name="android:windowTranslucentNavigation">false</item>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X