如何从自定义视图传递样式attr?

时间:2016-11-29 14:23:33

标签: android

我正在创建一个自定义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" />

我怎么能实现这个目标?

2 个答案:

答案 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);
    }
}