安卓布局无法适配所有设备屏幕尺寸问题求解
问题根因
你布局在小屏设备溢出的核心原因是所有按钮都设置了80dp的固定高度,5行按钮加总高度是固定值,即使外层父容器设置了layout_weight按比例分配高度,内部按钮行高度超过父容器分配的可用高度时,就会直接超出屏幕边界。
修复方案
只需要调整按钮行和按钮的高度属性,让所有元素按比例分配可用空间即可:
- 按钮区域(权重为60的垂直LinearLayout)下的5个水平按钮行,把
layout_height从wrap_content改成0dp,同时添加layout_weight="1",让5行按钮平分父容器的可用高度 - 所有按钮的
layout_height从固定80dp改成match_parent,让按钮自动填满所在行的高度
修改后完整布局代码
<?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" tools:context=".MainActivity"> <LinearLayout android:layout_width="0dp" android:layout_height="0dp" android:orientation="vertical" android:visibility="visible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <TextView android:id="@+id/textViewInput" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="40" android:background="@color/white" android:gravity="bottom|end" android:maxLength="10" android:padding="8dp" android:textSize="36sp" android:autoSizeTextType="uniform" android:autoSizeMaxTextSize="36sp" android:autoSizeMinTextSize="16sp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="60" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal"> <Button android:id="@+id/buttonDigit7" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onDigitClicked" android:text="7" android:textSize="20sp" /> <Button android:id="@+id/buttonDigit8" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onDigitClicked" android:text="8" android:textSize="20sp" /> <Button android:id="@+id/buttonDigit9" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onDigitClicked" android:text="9" android:textSize="20sp" /> <Button android:id="@+id/buttonDivide" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onOperatorClick" android:text="/" android:textSize="20sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal"> <Button android:id="@+id/buttonDigit4" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onDigitClicked" android:text="4" android:textSize="20sp" /> <Button android:id="@+id/buttonDigit5" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onDigitClicked" android:text="5" android:textSize="20sp" /> <Button android:id="@+id/buttonDigit6" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onDigitClicked" android:text="6" android:textSize="20sp" /> <Button android:id="@+id/buttonMultiple" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onOperatorClick" android:text="*" android:textSize="20sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal"> <Button android:id="@+id/buttonDigit1" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onDigitClicked" android:text="1" android:textSize="20sp" /> <Button android:id="@+id/buttonDigit2" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onDigitClicked" android:text="2" android:textSize="20sp" /> <Button android:id="@+id/buttonDigit3" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onDigitClicked" android:text="3" android:textSize="20sp" /> <Button android:id="@+id/buttonMinus" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onOperatorClick" android:text="-" android:textSize="20sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal"> <Button android:id="@+id/buttonDot" android:layout_width="0dp" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onDecimalPointClick" android:text="." android:textSize="20sp" /> <Button android:id="@+id/buttonDigit0" android:layout_width="0dp" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onDigitClicked" android:text="0" android:textSize="20sp" /> <Button android:id="@+id/buttonClear" android:layout_width="0dp" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="clearText" android:text="CLR" android:textSize="20sp" /> <Button android:id="@+id/buttonPlus" android:layout_width="0dp" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_weight="1" android:backgroundTint="@color/black" android:onClick="onOperatorClick" android:text="+" android:textSize="20sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal"> <Button android:id="@+id/buttonEqual" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="3dp" android:backgroundTint="@color/black" android:onClick="onEqualClick" android:text="=" android:textSize="20sp" /> </LinearLayout> </LinearLayout> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
额外优化说明
给输入框额外加了文字自动缩放属性,避免小屏设备下输入内容太多显示不全,不需要可以直接删掉。调整后布局会自动适配所有屏幕尺寸,不会再出现溢出问题。
内容的提问来源于stack exchange,提问作者Danial Tavakoli
相关产品推荐
相关产品推荐

