2012-03-08 5 views
2

Я пытаюсь установить иерархию отношений между объектами. У каждого объекта есть родитель того же типа, что и сам, или null.Android: Пользовательский вид с ссылкой на объект из attrs.xml, всегда null

У меня есть main.xml, который содержит некоторые из них:

<com.morsetable.MorseKey 
    android:id="@+id/bi" 
    android:layout_weight="1" 
    custom:code=".." 
    custom:parentKey="@id/be" 
    android:text="@string/i" /> 

res/values/attrs.xml, который содержит один из них:

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

и класс (это не моя деятельность), которая содержит следующее:

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

Это не работает. Каждый MorseKey экземпляров отчетов N == 2 (хорошо) и parent == null (плохо). Подробнее, parent == null, даже когда я явно попытаюсь установить его на какое-то произвольное значение (см. Комментарий). Я также пробовал custom:parentKey="@+id/be" (со знаком плюс), но это тоже не сработало. Что я делаю не так?

ответ

1

Если ваш класс MorseKey находится в отдельном java-файле, который, как я полагаю, относится к вашему статуту «класс (это не моя деятельность)». Тогда я считаю, что проблема заключается в использовании findViewById(). findViewById() будет искать ресурс в самом представлении MorseKey, а не в файле main.xml.

Возможно, попробуйте получить родительский экземпляр экземпляра MorseKey и вызвать parent.findViewById().

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

Хотя это будет работать, только если ваш родитель и ребенок MorseKey находятся в одном макете.

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

Но было бы довольно трудно найти вид, если ваш макет что-то подобное с родителем и ребенком в отдельных макетов.

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

Научите меня обращать внимание на API. Если я вызову this.getRootView(), я получаю, что каждый MorseKey является собственным корневым представлением. – mkjeldsen

+0

Ах! Вызов getParent() из конструктора слишком скоро, представления еще не добавлены в их родительские представления. Я смог отложить звонок и заставить его работать. – mkjeldsen