如何读取多种格式的自定义属性的值?

时间:2017-02-09 12:30:38

标签: android android-studio

related SO question

我们可以定义多种类型的自定义属性。

<declare-styleable name="RoundedImageView">
    <attr name="cornerRadius" format="dimension|fraction"/>
</declare-styleable>

我想以下列方式使用它

<RoundedImageView app:cornerRadius="30dp"/>
<RoundedImageView app:cornerRadius="20%"/>

如何读取它的值?

API级别21提供了API TypedArray.getType(index)

int type = a.getType(R.styleable.RoundedImageView_cornerRadius);
if (type == TYPE_DIMENSION) {
    mCornerRadius = a.getDimension(R.styleable.RoundedImageView_cornerRadius, 0);
} else if (type == TYPE_FRACTION) {
    mCornerRadius = a.getFraction(R.styleable.RoundedImageView_cornerRadius, 1, 1, 0);
}

我想这是推荐的解决方案。

但是如何在较低的API级别下执行此操作?我必须使用try catch吗?

或者只是定义两个属性... cornerRadiuscornerRadiusPercentage ...我会在CSS中错过border-radius

1 个答案:

答案 0 :(得分:0)

感谢@ Selvin的评论。您可以使用TypedArray.getValue(...) + TypedValue.type。您可以找到类型常量here

TypedValue tv = new TypedValue();
a.getValue(R.styleable.RoundedImageView_cornerRadius, tv);
if (tv.type == TYPE_DIMENSION) {
    mCornerRadius = tv.getDimension(getContext().getResources().getDisplayMetrics());
} else if (tv.type == TYPE_FRACTION) {
    mCornerRadius = tv.getFraction(1, 1);
    mUsePercentage = true;
}