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?

Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top