我正在创建一个自定义TextSwitcher,如下所示
public class CustomTextSwitcher extends TextSwitcher {
private static final long SHOW_TEXT_ANIMATION_TIME = 100;
public CustomTextSwitcher(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
Animation in = AnimationUtils.loadAnimation(context, android.R.anim.fade_in);
Animation out = AnimationUtils.loadAnimation(context, android.R.anim.fade_out);
in.setDuration(SHOW_TEXT_ANIMATION_TIME);
out.setDuration(SHOW_TEXT_ANIMATION_TIME);
this.setInAnimation(in);
this.setOutAnimation(out);
}
public void setStyle(final int style) {
this.setFactory(new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
return new TextView(new ContextThemeWrapper(context, style),
null, 0);
}
});
}
}
这很好,除了我需要在初始化后使用上面声明的setStyle
函数显式设置样式。
我希望我不需要调用setStyle
但只需在XML中声明我的样式(如下面的代码所示)并通过构造函数中获得的attr
值获取int值,并将其发送到ViewFacory
,全部在init()
函数中完成。
<my.example.CustomTextSwitcher
android:id="@+id/search_list_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/recentSearchHeaderText" />
我怎么能实现这个目标?
答案 0 :(得分:0)
从构造函数中获取的AttributeSet
是从XML中的style
属性以及提供的其他属性生成的。所以你只需保存它然后在constructor to your TextView.中传递它。 setStyle
方法实际上可以与接受样式ID的TextView#setTextAppearance方法一起使用。它只会查看与TextView
关联的样式属性。我想说这比通过AttributeSet解析和创建自己的样式更容易。
答案 1 :(得分:0)
我找到了这样做的方法。它就像attrs.getStyleAttribute()
一样简单。显示下面的代码
public class CustomTextSwitcher extends TextSwitcher {
private static final long SHOW_TEXT_ANIMATION_TIME = 100;
public CustomTextSwitcher(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
private void init(AttributeSet attrs) {
this.setFactory(new ViewFactory() {
@Override
public View makeView() {
return new TextView(new ContextThemeWrapper(context,
attrs.getStyleAttribute()), null, 0);
}
});
Animation in = AnimationUtils.loadAnimation(context, android.R.anim.fade_in);
Animation out = AnimationUtils.loadAnimation(context, android.R.anim.fade_out);
in.setDuration(SHOW_TEXT_ANIMATION_TIME);
out.setDuration(SHOW_TEXT_ANIMATION_TIME);
this.setInAnimation(in);
this.setOutAnimation(out);
}
}