Android自定义视图获取多个属性

时间:2015-08-28 14:37:13

标签: java android android-custom-view

我正在Android中创建自定义视图。在它的构造函数中,我获取了一些在XML布局文件中设置的属性。代码是这样的:

public LabeledEditText(Context context, AttributeSet attrs) {
        super(context, attrs);

    TypedArray styledAttrs = context.getTheme().obtainStyledAttributes(attrs, new int[] { android.R.attr.id, android.R.attr.digits, android.R.attr.padding, android.R.attr.inputType }, 0, 0);
    try {
        int id = styledAttrs.getResourceId(styledAttrs.getIndex(0), -1);
        String digits = styledAttrs.getString(styledAttrs.getIndex(1));
        float padding = styledAttrs.getDimension(styledAttrs.getIndex(2), 0.1f);
        int inputType = styledAttrs.getInt(styledAttrs.getIndex(3), -1);
    } finally {
        styledAttrs.recycle();
    }
}

问题是obtainStyledAttributes没有获得所有属性,即使它们存在于属性集中。更奇怪的是,如果我改变int数组中id的顺序,我会得到不同的结果。例如,如果我使用以下排序

new int[] { android.R.attr.id, android.R.attr.digits, android.R.attr.padding, android.R.attr.inputType }

我找回了3个属性,但如果我使用以下排序

new int[] {android.R.attr.digits, android.R.attr.padding, android.R.attr.inputType, android.R.attr.id }

我回来了2.我包括这2个案例的2个手表窗口截图。断点在try语句之后设置。

1st ordering

2nd ordering

在任何情况下,如果我一次获得一个属性,它适用于所有属性。 obtainStyledAttributes如何工作?另外我不确定是否应该使用styledAttrs.getIndex(i)函数,但是在解决当前函数之后这是一个问题。

1 个答案:

答案 0 :(得分:1)

虽然未记录,但obtainStyledAttributes需要排序数组,并且其代码已根据该假设进行优化。

因此,您需要为styledAttrs数组提供根据其id值按升序排序的元素。

有几种方法可以确定正确的顺序:

  • 基于他们在资源中的相对位置
  • 检查其相对值并更改数组以匹配
  • 或通过编程方式对数组元素进行排序

如果选择在运行时以编程方式对数组进行排序,请确保在调用getString()等时使用适当的(已排序的)索引。

另一个常见的解决方法是一次只能使用obtainStyledAttributes获取单个值。 (已经对具有一个元素的数组进行了排序。)

  

此外,我不确定是否应该使用styledAttrs.getIndex(i)函数

我认为,只有在您通过TypedArray进行循环并且可能某些元素可能没有值时,才有必要这样做;它基本上"隐藏"你的null元素就好像它是一个稀疏数组。一般情况下,除非您以某种方式访问​​样式资源,否则我认为没有必要,例如在实施自定义视图时。

大多数情况下,我使用与视图完全无关的自定义主题属性,在这种情况下,我总是发现TypedArray.getIndex()是多余的。