如何以编程方式获得?attr / value

时间:2017-07-20 14:53:29

标签: android android-styles

我尝试做一些自定义视图样式,但我无法从主题中正确选取样式属性。

例如,我想获得主题EditText的文字颜色。

通过主题堆栈,您可以看到我的主题使用它来设计它的EditText'

<style name="Base.V7.Widget.AppCompat.EditText" parent="android:Widget.EditText">
    <item name="android:background">?attr/editTextBackground</item>
    <item name="android:textColor">?attr/editTextColor</item>
    <item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item>
</style>

我正在寻找的是,我该怎么做?attr / editTextColor

(Aka,主题分配给&#34的值; android:editTextColor&#34;)

通过谷歌搜索,我找到了足够的答案:

TypedArray a = mView.getContext().getTheme().obtainStyledAttributes(R.style.editTextStyle, new int[] {R.attr.editTextColor});
int color = a.getResourceId(0, 0);
a.recycle();

但是我很确定我必须做错了,因为它总是显示为黑色而不是灰色?有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

你试过这个吗?

编辑: 如果你想要一个完整的答案问我,这是我的简短答案

您的attrs.xml文件:

<resources>

    <declare-styleable name="yourAttrs">
        <attr name="yourBestColor" format="color"/>
    </declare-styleable>

</resources>

编辑2:抱歉,我忘记了如何在layout.xml中使用我的attr值,所以:

<com.custom.coolEditext
    android:id="@+id/superEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:yourBestColor="@color/any_color"/>

然后在您的自定义Editext中:

TypedArray a = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.yourAttrs, 0, 0);

try {
    int colorResource = a.getColor(R.styleable.yourAttrs_yourBestColor, /*default color*/ 0);
} finally {
    a.recycle();
}

我不确定这是你想要的答案,但它可以让你走得很好

答案 1 :(得分:2)

从@pskink评论:

    TypedValue value = new TypedValue();
    getContext().getTheme().resolveAttribute(android.R.attr.editTextColor, value, true);
    getView().setBackgroundColor(value.data);

将从当前分配给上下文的主题中提取属性。

谢谢@pskink!