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?

War es hilfreich?

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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top