28

有了这个自定义视图MyView,我定义了一些自定义属性:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyView">
        <attr name="normalColor" format="color"/>
        <attr name="backgroundBase" format="integer"/>
    </declare-styleable>   
</resources>

并在布局 XML 中按如下方式分配它们:

    <com.example.test.MyView
        android:id="@+id/view1"
        android:text="@string/app_name"
        . . .
        app:backgroundBase="@drawable/logo1"
        app:normalColor="@color/blue"/>

起初我以为我可以backgroundBase使用以下方法检索自定义属性:

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyle, 0);
int base = a.getInteger(R.styleable.MyView_backgroundBase, R.drawable.blank);

仅当未分配属性并R.drawable.blank返回默认值时才有效。
app:backgroundBase被赋值时抛出异常“无法转换为整数类型=0xn”,因为即使自定义属性格式将其声明为整数,它确实引用了 aDrawable并且应按如下方式检索:

Drawable base = a.getDrawable(R.styleable.MyView_backgroundBase);
if( base == null ) base = BitMapFactory.decodeResource(getResources(), R.drawable.blank);

这有效。
现在我的问题是:
我真的不想Drawable从 TypedArray 中获取,我想要对应的整数 id app:backgroundBase(在上面的示例中它是 R.drawable.logo1)。我怎么才能得到它?

4

1 回答 1

49

原来答案就在那里:

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyView, defStyle, 0);
int base = a.getResourceId(R.styleable.MyView_backgroundBase, R.drawable.blank);
于 2013-05-04T14:29:16.143 回答