Android如何在系统字体大小变化时保持AutoCompleteTextView高度固定
解决方案
你遇到的问题核心是除了文字大小外,控件默认的字体内边距、行高、外层TextInputLayout的内置边距也会受系统字体缩放影响,仅修改文字单位为dp不足以完全控制高度,可按以下步骤调整:
1. 修改AutoCompleteTextView属性
新增以下属性,消除文字自带的可伸缩边距,固定行高:
android:includeFontPadding="false":禁用系统默认给文字添加的上下留白,这部分留白会随系统字体设置变大android:lineHeight="24dp":固定行高(数值可根据你的文字大小调整,18dp的文字配24dp行高即可)android:paddingVertical="0dp":清空控件自带的上下内边距,避免额外撑高控件
保留你原有配置:android:autoSizeTextType="none"、android:maxLines="1"、android:textSize="18dp"
2. 修改外层TextInputLayout属性
不要用match_parent高度,固定控件整体高度,消除内置边距:
- 将
android:layout_height修改为固定dp值,比如32dp(数值根据你的UI需求调整,要大于行高,预留边框的空间) - 新增
app:boxVerticalPadding="0dp":清空TextInputLayout内部默认的上下边距 - 如果你不需要浮动hint效果,新增
app:hintEnabled="false",可消除hint浮动预留的额外高度
3. 全局禁用Activity字体缩放(可选)
如果上述配置仍无法满足需求,可直接让当前Activity忽略系统字体缩放设置,在Activity代码中加入以下逻辑:
Java版本:
@Override public Resources getResources() { Resources res = super.getResources(); Configuration config = new Configuration(); config.setToDefaults(); res.updateConfiguration(config, res.getDisplayMetrics()); return res; }
Kotlin版本:
override fun getResources(): Resources { val res = super.getResources() val config = Configuration() config.setToDefaults() res.updateConfiguration(config, res.displayMetrics) return res }
调整后完整XML示例
<com.google.android.material.textfield.TextInputLayout android:id="@+id/contactNameTextField" android:layout_width="0dp" android:layout_height="32dp" android:layout_marginTop="5dp" android:layout_marginEnd="10dp" android:textColorHint="@color/hintColor" android:theme="@style/EditTextStyle" app:boxBackgroundColor="@color/fragmentBackground" app:boxStrokeWidth="3dp" app:boxVerticalPadding="0dp" app:hintEnabled="false" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toLeftOf="@id/nameText" app:layout_constraintTop_toTopOf="@id/nameText"> <AutoCompleteTextView android:id="@+id/itemContactName" android:layout_width="match_parent" android:layout_height="match_parent" android:autoSizeTextType="none" android:imeOptions="actionDone" android:maxLines="1" android:textSize="18dp" android:includeFontPadding="false" android:lineHeight="24dp" android:paddingVertical="0dp"/> </com.google.android.material.textfield.TextInputLayout>
可根据实际UI需求调整TextInputLayout的固定高度和AutoCompleteTextView的行高数值,两者匹配即可保证文字完全显示,同时不会随系统字体调整发生高度变化。
内容的提问来源于stack exchange,提问作者Yarin Shitrit
相关产品推荐
相关产品推荐

