AutoTextView自动文本大小适配参数异常崩溃的优雅处理咨询
解决TextView自动适配时的IllegalArgumentException问题
嘿,这个问题我之前做多设备适配的时候踩过坑!报错信息说得很直白:你给TextView设置的自动缩放最大字号(24.67px)居然比最小字号(31.5px)还小,系统直接懵了,所以抛出了IllegalArgumentException。下面给你几个优雅的处理方案:
排查并修正XML配置
首先检查你的布局文件里,TextView的自动缩放参数是不是写反了。比如你可能不小心把autoSizeMaxTextSize设得比autoSizeMinTextSize还小,而且尽量用sp而非px作为单位,适配性更好:<!-- 错误示例:max < min --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" app:autoSizeMinTextSize="31.5sp" app:autoSizeMaxTextSize="24sp" app:autoSizeTextType="uniform" /> <!-- 正确示例:max > min --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" app:autoSizeMinTextSize="12sp" app:autoSizeMaxTextSize="31.5sp" app:autoSizeTextType="uniform" />代码动态设置时添加校验逻辑
如果是在Java/Kotlin代码里动态配置自动缩放范围,一定要先判断最大字号是否大于最小字号,不满足的话主动修正:// 获取定义在dimens.xml中的字号值 float minSizeSp = getResources().getDimension(R.dimen.min_text_size) / getResources().getDisplayMetrics().scaledDensity; float maxSizeSp = getResources().getDimension(R.dimen.max_text_size) / getResources().getDisplayMetrics().scaledDensity; // 校验并修正范围 if (maxSizeSp <= minSizeSp) { // 可以把max设为min的1.2倍,或者用业务允许的默认最大值 maxSizeSp = minSizeSp * 1.2f; } // 安全设置自动缩放 textView.setAutoSizeTextTypeUniformWithConfiguration( (int) minSizeSp, (int) maxSizeSp, 1, TypedValue.COMPLEX_UNIT_SP );封装自定义安全TextView(一劳永逸)
要是项目里很多地方都用到自动缩放的TextView,不如封装一个自定义View,内部自动处理参数校验,避免重复写逻辑:public class SafeAutoSizeTextView extends AppCompatTextView { private AttributeSet attrs; public SafeAutoSizeTextView(Context context) { super(context); initAutoSizeConfig(); } public SafeAutoSizeTextView(Context context, AttributeSet attrs) { super(context, attrs); this.attrs = attrs; initAutoSizeConfig(); } public SafeAutoSizeTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.attrs = attrs; initAutoSizeConfig(); } private void initAutoSizeConfig() { // 获取XML中设置的自动缩放参数 TypedArray ta = getContext().obtainStyledAttributes(attrs, new int[]{ androidx.appcompat.R.attr.autoSizeMinTextSize, androidx.appcompat.R.attr.autoSizeMaxTextSize }); float minSizePx = ta.getDimension(0, getResources().getDimension(R.dimen.default_min_text_size)); float maxSizePx = ta.getDimension(1, getResources().getDimension(R.dimen.default_max_text_size)); ta.recycle(); float minSizeSp = minSizePx / getResources().getDisplayMetrics().scaledDensity; float maxSizeSp = maxSizePx / getResources().getDisplayMetrics().scaledDensity; // 校验修正 if (maxSizeSp <= minSizeSp) { maxSizeSp = minSizeSp * 1.5f; } setAutoSizeTextTypeUniformWithConfiguration( (int) minSizeSp, (int) maxSizeSp, 1, TypedValue.COMPLEX_UNIT_SP ); } }
最后再提个小建议:尽量用sp作为字号单位,它会跟随系统字体大小设置变化,比px适配性更强;如果是处理超长文本,记得配合android:ellipsize="end"属性,避免文本溢出。
内容的提问来源于stack exchange,提问作者Praveen Pandey
相关产品推荐
相关产品推荐

