37 Stimmen

Layout anpassen, wenn die Soft-Tastatur eingeschaltet ist

Ich habe gesehen, dass sich in einigen Anwendungen das Layout verschiebt, wenn die Soft-Tastatur angezeigt wird. Dies ist sicherlich nicht adjustPan weil sich das gesamte Layout (wahrscheinlich das innere Layout) verschiebt, nicht nur das aktuelle EditText . Dies ist zum Beispiel in Evernote Anmeldebildschirm. Können Sie beraten, wie dies gemacht?

70voto

Alex Orlov Punkte 17949

Hier ist eine Lösung, die wie der Anmeldebildschirm von Evernote funktioniert:

Definieren Sie zunächst eine Klasse, die Ihr spezielles LinearLayout sein wird, wie folgt:

public class MyLayout extends LinearLayout {

public MyLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public MyLayout(Context context) {
    super(context);
}

private OnSoftKeyboardListener onSoftKeyboardListener;

@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
    if (onSoftKeyboardListener != null) {
        final int newSpec = MeasureSpec.getSize(heightMeasureSpec); 
        final int oldSpec = getMeasuredHeight();
        if (oldSpec > newSpec){
            onSoftKeyboardListener.onShown();
        } else {
            onSoftKeyboardListener.onHidden();
        }
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

public final void setOnSoftKeyboardListener(final OnSoftKeyboardListener listener) {
    this.onSoftKeyboardListener = listener;
}

public interface OnSoftKeyboardListener {
    public void onShown();
    public void onHidden();
}

}

Dieses Layout achtet auf Maßänderungen, und wenn die neuen Maße < sind als die alten, bedeutet das, dass ein Teil des Bildschirms von der Soft-Tastatur eingenommen wird.

Damit das funktioniert, müssen Sie in Ihrem Manifest Folgendes festlegen android:windowSoftInputMode="adjustResize" damit der Inhalt in der Größe verändert und nicht nur verschoben wird.

Und das ganze System funktioniert wie folgt: Sie haben Ihr Layout:

<MyLayout id="layout">
  <SomeImage id="image"/>
  <SomeText>
  <SomeInput>
</MyLayout>

Es ist wie der Anmeldebildschirm von Evernotes. Dann, in Ihrer Aktivität:

((MyLayout)findViewById(R.id.layout)).setOnSoftKeyboardListener(new OnSoftKeyboardListener() {
        @Override
        public void onShown() {
            findViewById(R.id.image).setVisibility(View.GONE);
        }
        @Override
        public void onHidden() {
            findViewById(R.id.image).setVisibility(View.VISIBLE);
        }
    });

Gehen Sie dann zur Datei manifest.xml und setzen Sie

android:windowSoftInputMode="adjustResize"

Wenn die weiche Tastatur angezeigt wird, wird das Bild ausgeblendet und die Größe des restlichen Inhalts angepasst. (Sie können sehen, wie die Größe von Text in Evernote geändert wird)

Das Ausblenden von Bildern ist natürlich eine der vielen Möglichkeiten, die Sie haben. Aber Sie müssen vorsichtig sein, da verschiedene Layoutänderungen auch onMeasure aufrufen.

Natürlich ist es eine schmutzige Variante. Man muss prüfen, ob sich die Ausrichtung geändert hat, und den richtigen Zeitpunkt für die Messungen wählen. Aber ich denke, das ist die einzige Möglichkeit, es zu tun.

10voto

naXa Punkte 30160

Utilice "adjustResize" 代わりに "adjustPan" in AndroidManifest.xml

<activity
    ...
    android:windowSoftInputMode="adjustResize" />

Von der Dokumentation :

"adjustResize"
Die Größe des Hauptfensters der Aktivität wird immer angepasst, um Platz für die Soft-Tastatur auf dem Bildschirm zu schaffen.

"adjustPan"
Die Größe des Hauptfensters der Aktivität wird nicht verändert, um Platz für die Soft-Tastatur zu schaffen. Vielmehr wird der Inhalt des Fensters automatisch geschwenkt, so dass der aktuelle Fokus nie von der Tastatur verdeckt wird und der Benutzer immer sehen kann, was er gerade tippt. Dies ist im Allgemeinen weniger wünschenswert als eine Größenänderung, da der Benutzer möglicherweise die Softtastatur schließen muss, um an verdeckte Teile des Fensters zu gelangen und mit ihnen zu interagieren.

6voto

2voto

Madhav Punkte 283

Das hat bei mir funktioniert Hier ist Ihr Oncreate

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

2voto

M. Usman Khan Punkte 4242

Die ausgewählte Antwort funktioniert nicht im Vollbildmodus. Die folgende einzeilige Lösung hat bei mir funktioniert:

 AndroidBug5497Workaround.assistActivity(this);

kopieren Sie die Klasse AndroidBug5497Workaround von:

Android Wie passt man das Layout im Vollbildmodus an, wenn das Softkeyboard sichtbar ist?

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