Android:Visualização personalizada com referência de objeto de attrs.xml, sempre nulo
-
09-12-2019 - |
Pergunta
Estou tentando configurar uma hierarquia de relacionamento entre objetos.Todo objeto tem um pai do mesmo tipo que ele, ou null
.
eu tenho um main.xml
que contém alguns destes:
<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 contém um destes:
<declare-styleable name="MorseKey">
<attr name="code" format="string"/>
<attr name="parentKey" format="reference"/>
</declare-styleable>
e uma classe (que não é minha atividade) que contém isto:
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;
}
Isso não está funcionando.Todo MorseKey
relatórios de instância N == 2
(bom e parent == null
(ruim).Mais, parent == null
mesmo quando tento explicitamente configurá-lo para algum valor arbitrário (veja o comentário).Eu também tentei custom:parentKey="@+id/be"
(com o sinal de mais), mas também não funcionou.O que estou fazendo de errado?
Solução
Se a sua classe MorseKey estiver em um arquivo Java separado, o que presumo ser o caso da sua declaração "uma classe (essa não é minha atividade)".Então acredito que o problema está no uso de findViewById().findViewById() procurará um recurso na própria visualização MorseKey, em vez do arquivo main.xml.
Talvez tente obter o pai da instância MorseKey e chamar parent.findViewById().
case R.styleable.MorseKey_parentKey:
parent = this.getParent().findViewById(a.getResourceId(attr, -1));
Embora isso só funcione se o pai e o filho do MorseKey estiverem no mesmo layout.
<LinearLayout ...>
<MorseKey ..../><!-- parent -->
<MorseKey ..../><!-- child -->
</LinearLayout>
Mas seria muito difícil encontrar a visualização se o seu layout fosse algo assim, com pai e filho em layouts separados.
<LinearLayout ...>
<MorseKey ..../><!-- parent -->
</LinearLayout>
<LinearLayout ...>
<MorseKey ..../><!-- child -->
</LinearLayout>