Андроид:Пользовательское представление со ссылкой на объект из attrs.xml, всегда равно нулю.
-
09-12-2019 - |
Вопрос
Я пытаюсь настроить иерархию отношений между объектами.Каждый объект имеет родителя того же типа, что и он сам, или 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"
(со знаком плюса), но это тоже не сработало.Что я делаю не так?
Решение
Если ваш класс MorseKey находится в отдельном Java-файле, что, как я предполагаю, соответствует вашему заявлению «класс (это не моя деятельность)».Тогда я считаю, что проблема в использовании findViewById().findViewById() будет искать ресурс в самом представлении MorseKey, а не в файле main.xml.
Возможно, попробуйте получить родительский элемент экземпляра MorseKey и вызвать родительский.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>