Für diejenigen, die ConstraintLayout verwenden , android:windowSoftInputMode="adjustPan|adjustResize"
funktioniert dies nicht.
Sie können einen Soft-Tastatur-Listener verwenden , Einschränkungen für die Ansichten von unten nach unten in den oberen Ansichten festlegen und dann für jede Ansicht eine vertikale Abweichung (als Positionsprozentsatz zwischen Einschränkungen) für eine horizontale Richtlinie festlegen (ebenfalls prozentual positioniert) , aber an die Eltern).
Für jede Ansicht müssen wir nur programmgesteuert ändern app:layout_constraintBottom_toBottomOf
, @+id/guideline
wann die Tastatur angezeigt wird.
<ImageView
android:id="@+id/loginLogo"
...
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.15" />
<RelativeLayout
android:id="@+id/loginFields"
...
app:layout_constraintVertical_bias=".15"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginLogo">
<Button
android:id="@+id/login_btn"
...
app:layout_constraintVertical_bias=".25"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginFields"/>
Im Allgemeinen nimmt eine Softtastatur nicht mehr als 50% der Bildschirmhöhe ein. Somit können Sie die Richtlinie auf 0,5 setzen.
<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5"/>
Wenn die Tastatur jetzt programmgesteuert nicht angezeigt wird , können wir den gesamten app:layout_constraintBottom_toBottomOf
Rücken auf übergeordnet setzen, und umgekehrt.
unregistrar = KeyboardVisibilityEvent.registerEventListener(this, isOpen -> {
loginLayout.startAnimation(AnimationManager.getFade(200));
if (isOpen) {
setSoftKeyViewParams(loginLogo, R.id.guideline, ConstraintLayout.LayoutParams.PARENT_ID, -1, "235:64", 0.15f,
63, 0, 63, 0);
setSoftKeyViewParams(loginFields, R.id.guideline, -1, R.id.loginLogo, null, 0.15f,
32, 0, 32, 0);
setSoftKeyViewParams(loginBtn, R.id.guideline, -1, R.id.useFingerPrintIdText, null, 0.5f,
32, 0, 32, 0);
} else {
setSoftKeyViewParams(loginLogo, ConstraintLayout.LayoutParams.PARENT_ID, ConstraintLayout.LayoutParams.PARENT_ID, -1, "235:64", 0.15f,
63, 0, 63, 0);
setSoftKeyViewParams(loginFields, ConstraintLayout.LayoutParams.PARENT_ID, -1, R.id.loginLogo,null, 0.15f,
32, 0, 32, 0);
setSoftKeyViewParams(loginBtn, ConstraintLayout.LayoutParams.PARENT_ID, -1, R.id.useFingerPrintIdText,null, 0.25f,
32, 0, 32, 0);
}
});
Nennen Sie diese Methode:
private void setSoftKeyViewParams(View view, int bottomToBottom, int topToTop, int topToBottom, String ratio, float verticalBias,
int left, int top, int right, int bottom) {
ConstraintLayout.LayoutParams viewParams = new ConstraintLayout.LayoutParams(view.getLayoutParams().width, view.getLayoutParams().height);
viewParams.dimensionRatio = ratio;
viewParams.bottomToBottom = bottomToBottom;
viewParams.topToTop = topToTop;
viewParams.topToBottom = topToBottom;
viewParams.endToEnd = ConstraintLayout.LayoutParams.PARENT_ID;
viewParams.startToStart = ConstraintLayout.LayoutParams.PARENT_ID;
viewParams.verticalBias = verticalBias;
viewParams.setMargins(Dimensions.dpToPx(left), Dimensions.dpToPx(top), Dimensions.dpToPx(right), Dimensions.dpToPx(bottom));
view.setLayoutParams(viewParams);
}
Wichtig ist, dass Sie die vertikale Vorspannung so einstellen, dass sie korrekt skaliert wird, wenn die Tastatur angezeigt und nicht angezeigt wird.
Theme.AppCompat.Light.NoActionBar.FullScreen
) gemäß dieser Antwort nicht funktioniert -> stackoverflow.com/a/7509285/1307690