Đối với những người sử dụng ConstraintLayout , android:windowSoftInputMode="adjustPan|adjustResize"
sẽ không hoạt động.
Những gì bạn có thể làm là sử dụng trình nghe bàn phím mềm , đặt các ràng buộc của các khung nhìn từ dưới lên dưới của các chế độ xem trên, sau đó đặt độ lệch dọc cho mỗi chế độ xem (dưới dạng phần trăm vị trí giữa các ràng buộc) thành hướng dẫn ngang (cũng được định vị theo tỷ lệ phần trăm , nhưng với cha mẹ).
Đối với mỗi quan điểm, chúng ta chỉ cần thay đổi app:layout_constraintBottom_toBottomOf
để @+id/guideline
khi bàn phím được hiển thị , lập trình của khóa học.
<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"/>
Nói chung, một bàn phím mềm chiếm không quá 50% chiều cao của màn hình. Do đó, bạn có thể đặt hướng dẫn ở mức 0,5.
<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"/>
Bây giờ lập trình, khi bàn phím không được hiển thị , chúng ta có thể đặt tất cả app:layout_constraintBottom_toBottomOf
trở lại thành cha, ngược lại.
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);
}
});
Gọi phương thức này:
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);
}
Điều quan trọng là đảm bảo đặt độ lệch dọc theo cách có thể chia tỷ lệ chính xác khi bàn phím được hiển thị và không hiển thị.
Theme.AppCompat.Light.NoActionBar.FullScreen
), theo câu trả lời này -> stackoverflow.com/a/7509285/1307690