如何让Android应用适配不同屏幕尺寸,解决布局视图对齐异常问题
问题原因
- 你当前的约束写法存在冲突:每个控件同时将上下边界约束到父容器上下边缘,同时设置了固定的上下margin值,窗口尺寸发生变化时,双向约束和固定margin的优先级发生冲突,导致控件位置偏移、间距异常
- 控件之间没有建立相对约束关系,全部单独和父容器绑定,控件间的间距完全依赖固定margin,无法在窗口尺寸变化时保持稳定的相对位置
修复方案
将控件改为垂直方向依次约束,只保留水平方向的居中约束,控件间用固定间距绑定,修改后的布局代码如下:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#264563" tools:context=".MainActivity"> <!-- 第一个输入框,水平居中,垂直方向用bias固定位置,不再绑定底部到父容器 --> <EditText android:id="@+id/editTextTextPersonName" android:layout_width="280dp" android:layout_height="40dp" android:background="@drawable/login_plaintext_layout" android:ems="10" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.3" /> <!-- 第二个输入框,约束到第一个输入框底部,间距固定为27dp,水平和第一个输入框对齐 --> <EditText android:id="@+id/editTextTextPersonName2" android:layout_width="280dp" android:layout_height="40dp" android:layout_marginTop="27dp" android:background="@drawable/login_plaintext_layout" android:ems="10" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="@id/editTextTextPersonName" app:layout_constraintStart_toStartOf="@id/editTextTextPersonName" app:layout_constraintTop_toBottomOf="@id/editTextTextPersonName" /> <!-- 按钮,约束到第二个输入框底部,间距固定为31dp,水平和输入框对齐 --> <Button android:id="@+id/button" android:layout_width="280dp" android:layout_height="50dp" android:layout_marginTop="31dp" android:backgroundTint="#ba6f13" android:text="Button" app:layout_constraintEnd_toEndOf="@id/editTextTextPersonName2" app:layout_constraintStart_toStartOf="@id/editTextTextPersonName2" app:layout_constraintTop_toBottomOf="@id/editTextTextPersonName2" /> </androidx.constraintlayout.widget.ConstraintLayout>
优化说明
- 移除了所有控件不必要的底部约束和固定上下margin,避免双向约束冲突
- 控件之间建立垂直方向的链式约束,两个输入框和按钮的间距固定,不会随窗口尺寸变化发生偏移
- 所有控件水平统一对齐,只通过第一个输入框的
layout_constraintVertical_bias调整整体表单的垂直位置,调整这个0~1之间的数值就能上下移动整个表单的位置,适配不同窗口高度时只需要改这一个参数即可
内容的提问来源于stack exchange,提问作者EagleFighter
相关产品推荐
相关产品推荐

