Pregunta

Estoy intentando configurar una jerarquía de relaciones entre objetos.Cada objeto tiene un padre del mismo tipo que él, o null.

tengo un main.xml que contiene algunos de estos:

<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 que contiene uno de estos:

<declare-styleable name="MorseKey">
    <attr name="code" format="string"/>
    <attr name="parentKey" format="reference"/>
</declare-styleable>

y una clase (que no es mi actividad) que contiene esto:

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

Esto no funciona.Cada MorseKey informes de instancia N == 2 (bueno y parent == null (malo).Más, parent == null incluso cuando intento explícitamente configurarlo en algún valor arbitrario (ver comentario).yo también lo he probado custom:parentKey="@+id/be" (con el signo más) pero eso tampoco funcionó.¿Qué estoy haciendo mal?

¿Fue útil?

Solución

Si su clase MorseKey está en un archivo Java separado, supongo que es el caso según su declaración "una clase (que no es mi actividad)".Entonces creo que el problema está en el uso de findViewById().findViewById() buscará un recurso dentro de la vista MorseKey en lugar del archivo main.xml.

Tal vez intente obtener el padre de la instancia de MorseKey y llamar a parent.findViewById().

case R.styleable.MorseKey_parentKey:
    parent = this.getParent().findViewById(a.getResourceId(attr, -1));

Aunque esto sólo funcionará si el padre y el hijo de MorseKey están en el mismo diseño.

<LinearLayout ...>
     <MorseKey ..../><!-- parent -->
     <MorseKey ..../><!-- child -->
</LinearLayout>

Pero sería bastante difícil encontrar la vista si su diseño es algo así con el padre y el niño en diseños separados.

<LinearLayout ...>
     <MorseKey ..../><!-- parent -->
</LinearLayout>
<LinearLayout ...>
     <MorseKey ..../><!-- child -->
</LinearLayout>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top