Androide:Vista personalizada con referencia de objeto de attrs.xml, siempre nula
-
09-12-2019 - |
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?
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>