【发布时间】:2013-10-03 23:37:24
【问题描述】:
我有一个简单的自定义 TextView,它在其构造函数中设置自定义字体,如下面的代码
public class MyTextView extends TextView {
@Inject CustomTypeface customTypeface;
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
RoboGuice.injectMembers(context, this);
setTypeface(customTypeface.getTypeface(context, attrs));
setPaintFlags(getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
}
}
从 Gingerbread 到 JB 4.2 都可以正常工作。但是当我在 Android 4.3 手机上显示我的自定义文本视图时,adb logcat 中充斥着以下消息。
10-05 16:09:15.225: WARN/View(9864): requestLayout() improperly called by com.cmp.views.MyTextView{42441b00 V.ED.... ......ID 18,218-456,270 #7f060085 app:id/summary} during layout: running second layout pass
10-05 16:09:15.225: WARN/View(9864): requestLayout() improperly called by com.cmp.views.MyTextView{423753d0 V.ED.... ......ID 26,176-742,278 #7f060085 app:id/summary} during layout: running second layout pass
我注意到,它确实会减慢 UI 速度。任何想法为什么会在 4.3 上发生?
感谢您的帮助。
【问题讨论】:
-
您是否尝试过在视图生命周期的后期移动
setTypeface()和/或setPaintFlags(),例如onFinishInflate()之类的?我的猜测是setTypeface()正在触发requestLayout(),因为他们可能没想到它会在视图构造函数中被调用。 -
我尝试将其移至 onFinishInflate(),但也无济于事。我在日志中看到了那些 requestLayout() 消息
-
MyTextView 的唯一目的是设置自定义字体吗?创建自定义视图来设置自定义字体不是一个好的解决方案。
-
它还设置了绘制标志,例如添加 Paint.SUBPIXEL_TEXT_FLAG。我不想在多个位置设置绘制标志,因为此文本视图用于应用程序的许多布局中。
-
我也看到了,我只打电话给
setTypeface()。
标签: android android-layout textview android-custom-view