Xamarin.Android自定义TextView使用AutoSizeTextType uniform不生效怎么办
Xamarin.Android 自定义TextView自动字体缩放失效修复方案
失效核心原因
- 自定义
NoobTextView初始化时未正确开启系统内置的自动字体缩放逻辑,或重写核心生命周期方法时屏蔽了父类的缩放计算触发 - 若继承自
AppCompatTextView,未启用兼容包对低版本系统的缩放适配 - XML布局中配置了固定的
textSize属性,覆盖了自动缩放的计算结果
修复步骤
1. 自定义类内部初始化开启自动缩放
在自定义类的所有构造方法中调用缩放初始化逻辑,代码示例:
using Android.Support.V4.Widget; using Android.Content; using Android.Util; using Android.Text; using Android.Widget; public class NoobTextView : AppCompatTextView { public NoobTextView(Context context) : base(context) { InitAutoSizeConfig(); } public NoobTextView(Context context, IAttributeSet attrs) : base(context, attrs) { InitAutoSizeConfig(); } public NoobTextView(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr) { InitAutoSizeConfig(); } private void InitAutoSizeConfig() { // 开启宽高自适应的均匀缩放模式 SetAutoSizeTextTypeWithDefaults(AutoSizeTextType.Uniform); // 自定义缩放参数:最小字体8sp,最大30sp,每次调整步长1sp SetAutoSizeTextTypeUniformWithConfiguration(8, 30, 1, (int)ComplexUnitType.Sp); } // 若重写了setText方法,必须调用父类方法后触发布局更新 public override void SetText(ICharSequence text, BufferType type) { base.SetText(text, type); RequestLayout(); } // 若重写了onMeasure方法,测量完成后保留父类的缩放逻辑 protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) { base.OnMeasure(widthMeasureSpec, heightMeasureSpec); } }
2. XML布局配置调整
不要在布局中写固定的android:textSize属性,优先使用app命名空间配置缩放参数,兼容低版本系统:
<!-- 根布局需要声明命名空间 xmlns:app="http://schemas.android.com/apk/res-auto" --> <你的包名路径.NoobTextView android:layout_width="match_parent" android:layout_height="40dp" android:maxLines="1" app:autoSizeTextType="uniform" app:autoSizeMinTextSize="8sp" app:autoSizeMaxTextSize="30sp" app:autoSizeStepGranularity="1sp" android:text="测试动态文本内容"/>
验证
修改控件文本内容后,字体大小会自动适配控件尺寸,和原生TextView缩放行为一致。
内容的提问来源于stack exchange,提问作者S. Koshelnyk
相关产品推荐
相关产品推荐

