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

我有一个具有TextView的自定义视图。 我做了一个方法,返回TextView的resourceID 。 如果没有定义文本,则默认返回-1。 我也有一个从视图Ainheritance的自定义视图B 我的自定义视图有文字“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); } } 

到目前为止,我发现的另一个解决scheme是执行以下操作。 我也觉得这是一种哈克。

 <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> 

如何从自定义视图的超类中获取属性? 我似乎无法findinheritance与自定义视图如何工作的任何好例子。

Solutions Collecting From Web of "Android:如何从自定义视图的超类中获取属性"

显然这是正确的做法:

 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线