Ich habe eine benutzerdefinierte Ansicht A
, die eine TextView hat. Ich habe eine Methode erstellt, die das für das TextView zurückgibt. Wenn kein Text definiert ist, gibt die Methode standardmäßig -1 zurück. Ich habe auch eine benutzerdefinierte Ansicht B
, die von Sicht A
erbt. Meine benutzerdefinierte Ansicht hat den Text "Hallo". Wenn ich die Methode aufrufen, um das Attribut der Superklasse zu bekommen, bekomme ich stattdessen -1 zurück.Android: So erhalten Sie ein Attribut aus einer Superklasse einer benutzerdefinierten Ansicht
In dem Code gibt es auch ein Beispiel dafür, wie ich den Wert abrufen kann, aber es fühlt sich irgendwie hacky.
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>
Klasse 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);
}
Klasse 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);
}
}
Eine andere Lösung, die ich f haben Bisher ist Folgendes zu tun. Ich denke auch, dass das eine Art Hacky ist.
<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>
Wie erhalten Sie ein Attribut von einer Superklasse einer benutzerdefinierten Ansicht? Ich kann keine guten Beispiele dafür finden, wie Vererbung mit benutzerdefinierten Ansichten funktioniert.