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

威灵

我有一个A具有TextView的自定义视图我做了一个返回resourceIDTextView的方法。如果未定义任何文本,则默认情况下该方法将返回-1。我也有一个B继承自view的自定义视图A我的自定义视图的文字为“ hello”。当我调用该方法以获取超类的属性时,我将返回-1。

在代码中,还有一个示例,说明了我如何能够检索值,但感觉有点黑。

attrs.xml

<declare-styleable name="A">
    <attr name="mainText" format="reference" />
</declare-styleable>

<declare-styleable name="B" parent="A">
    <attr name="subText" format="reference" />
</declare-styleable>

A级

protected static final int UNDEFINED = -1;

protected void init(Context context, AttributeSet attrs, int defStyle)
{
     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.A, defStyle, 0);

     int mainTextId = getMainTextId(a);

     a.recycle();

     if (mainTextId != UNDEFINED)
     {
        setMainText(mainTextId);
     }
}

protected int getMainTextId(TypedArray a)
{
  return a.getResourceId(R.styleable.A_mainText, UNDEFINED);
}

B级

protected void init(Context context, AttributeSet attrs, int defStyle)
{
  super.init(context, attrs, defStyle);

  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.B, defStyle, 0);

  int mainTextId = getMainTextId(a); // this returns -1 (UNDEFINED)

  //this will return the value but feels kind of hacky
  //TypedArray b = context.obtainStyledAttributes(attrs, R.styleable.A, defStyle, 0);
  //int mainTextId = getMainTextId(b); 

  int subTextId = getSubTextId(a);

  a.recycle();

  if (subTextId != UNDEFINED)
  {
     setSubText(subTextId);
  }
}

到目前为止,我发现的另一种解决方案是执行以下操作。我也认为这有点怪异。

<attr name="mainText" format="reference" />

<declare-styleable name="A">
    <attr name="mainText" />
</declare-styleable>

<declare-styleable name="B" parent="A">
    <attr name="mainText" />
    <attr name="subText" format="reference" />
</declare-styleable>

如何从自定义视图的超类获取属性?我似乎找不到关于继承如何与自定义视图一起工作的好示例。

威灵

显然,这是正确的方法:

protected void init(Context context, AttributeSet attrs, int defStyle) {
    super.init(context, attrs, defStyle);

    TypedArray b = context.obtainStyledAttributes(attrs, R.styleable.B, defStyle, 0);
    int subTextId = getSubTextId(b);
    b.recycle();

    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.A, defStyle, 0);
    int mainTextId = getMainTextId(a);
    a.recycle();

    if (subTextId != UNDEFINED) {
        setSubText(subTextId);
    }
}

TextView.java源代码中有一个示例在1098行

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Android自定义视图中设置XML属性后触发回调?

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

如何自定义视图Android SDK,日历视图

如何在ASP.Net MVC 5视图中获取ApplicationUser的自定义属性值?

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

如何为自定义视图类设置可绘制的属性

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

如何获取多选的自定义属性

如何在我的自定义视图中使用标准属性android:text?

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

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

获取Django表单以继承自定义字段属性的类

Android Studio无法识别自定义视图类

BGL:如何从顶点迭代器获取自定义顶点属性类实例?

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

如何使用自定义内容扩展超类的方法

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

Android:如何创建自定义视图

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

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

如何在Android Studio中将ImageView添加到自定义视图类中?

来自自定义视图的 Android 错误膨胀类

将自定义类的属性绑定到视图

如何在自定义视图类中动态替换自定义子视图?

如何访问 NodeJs 视图中类的属性或自定义方法?

如何使用在 Android 自定义视图中设置的属性调整膨胀布局的大小?

Android:如何自定义文本视图或列表视图

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

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