Android:Benutzerdefinierte Ansicht mit Objektreferenz von attrs.xml, immer null
-
09-12-2019 - |
Frage
Ich versuche, eine Beziehungshierarchie zwischen Objekten einzurichten.Jedes Objekt hat ein übergeordnetes Objekt desselben Typs wie es selbst, oder null
.
Ich habe eine main.xml
das enthält einige davon:
<com.morsetable.MorseKey
android:id="@+id/bi"
android:layout_weight="1"
custom:code=".."
custom:parentKey="@id/be"
android:text="@string/i" />
a res/values/attrs.xml
das enthält eines davon:
<declare-styleable name="MorseKey">
<attr name="code" format="string"/>
<attr name="parentKey" format="reference"/>
</declare-styleable>
und eine Klasse (das ist nicht meine Aktivität), die das enthält:
public class MorseKey extends Button {
public MorseKey(Context context, AttributeSet attrs) {
super(context, attrs);
initMorseKey(attrs);
}
private void initMorseKey(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs,
R.styleable.MorseKey);
final int N = a.getIndexCount();
for (int i = 0; i < N; i++) {
int attr = a.getIndex(i);
switch (attr)
{
case R.styleable.MorseKey_code:
code = a.getString(attr);
break;
case R.styleable.MorseKey_parentKey:
parent = (MorseKey)findViewById(a.getResourceId(attr, -1));
//parent = (MorseKey)findViewById(R.id.be);
Log.d("parent, N:", ""+parent+","+N);
break;
}
}
a.recycle();
}
private MorseKey parent;
private String code;
}
Das funktioniert nicht.Jeder MorseKey
instanzberichte N == 2
(gut) und parent == null
(schlecht).Mehr, parent == null
auch wenn ich explizit versuche, es auf einen beliebigen Wert zu setzen (siehe Kommentar).Ich habe es auch versucht custom:parentKey="@+id/be"
(mit dem Pluszeichen) aber das hat auch nicht funktioniert.Was mache ich falsch?
Lösung
Wenn sich Ihre MorseKey-Klasse in einer separaten Java-Datei befindet, was meiner Meinung nach aus Ihrer Aussage "eine Klasse (das ist nicht meine Aktivität)" der Fall ist.Dann glaube ich, dass das Problem in Ihrer Verwendung von findViewById() liegt.findViewById () sucht nach einer Ressource in der MorseKey-Ansicht selbst und nicht in der Hauptansicht.xml-Datei.
Versuchen Sie vielleicht, das übergeordnete Element der MorseKey-Instanz abzurufen und das übergeordnete Element anzurufen.findViewById().
case R.styleable.MorseKey_parentKey:
parent = this.getParent().findViewById(a.getResourceId(attr, -1));
Dies funktioniert jedoch nur, wenn sich Ihr MorseKey-Elternteil und Ihr MorseKey-Kind im selben Layout befinden.
<LinearLayout ...>
<MorseKey ..../><!-- parent -->
<MorseKey ..../><!-- child -->
</LinearLayout>
Es wäre jedoch ziemlich schwierig, die Ansicht zu finden, wenn Ihr Layout ungefähr so aussieht, wobei Eltern und Kind in separaten Layouts sind.
<LinearLayout ...>
<MorseKey ..../><!-- parent -->
</LinearLayout>
<LinearLayout ...>
<MorseKey ..../><!-- child -->
</LinearLayout>