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

阿尔福克斯

我正在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();
    }
}

问题在于即使这些属性存在于属性集中,其均不会获得所有属性。甚至更奇怪的是,如果我更改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个案例的watchs窗口的2个屏幕截图。断点是在try语句之后设置的。

第一次订购

第二次订购

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

洛恩·拉利伯特(Lorne Laliberte)

尽管没有记录,但obtainStyledAttributes需要一个有序数组,并在此假设下对其代码进行了优化。

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

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

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

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

另一个常见的解决方法是一次仅获取一个值obtainStyledAttributes(具有一个元素的数组已经排序。)

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

我认为只有在您遍历TypedArray且可能其中某些元素可能没有值时,这才是必要的它基本上为您“隐藏”了null元素,就好像它是一个稀疏数组一样。通常,除非您以某些方式(例如在实现自定义视图时)访问样式化的资源,否则我认为没有必要。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android:如何从自定义视图的超类获取属性

自定义android视图的“自定义类型”属性

如何在自定义视图中获取android默认属性

点击获取多个自定义属性值

jQuery从自定义属性中获取多个数据

在我的自定义视图上读取Android属性

在 Android 中使用枚举自定义视图属性

自定义视图样式,android的属性被忽略

动态添加自定义视图并设置其属性android

使用内置属性的Android自定义图像视图

Android 自定义视图获取宽度一次

如何从自定义视图android获取坐标

Android:在自定义列表视图中获取数据插入

在自定义颜色属性的Android三元操作的自定义视图

在Android Studio中找不到我的自定义视图的自定义属性

具有自定义属性的Android自定义视图

如何在Android中具有多个选择的自定义列表视图中获取选中的项目ID

绘制多个自定义视图

从“自定义视图”类的属性中按ID获取视图

自定义文本视图属性出错

获取自定义视图的项目

Android:具有现有布局的自定义视图的多个视图子级

创建一个android自定义视图,而不是具有不同数据的多个视图

Android自定义视图:将属性委派给视图内部的控件

Android 自定义视图:如何通过 LiveData 和数据绑定更新自定义枚举属性

具有自定义视图和自定义属性的Android 2-Way数据绑定

Android自定义视图属性-不允许使用“颜色”作为属性名称

获取自定义属性值

从自定义html属性获取价值