#android #android-xml
#Android #android-xml
Вопрос:
При объявлении пользовательского вида в xml, в чем разница между объявлением представления пользовательского класса или объявлением полностью пользовательского представления:
<LinearLayout>
<view class="packageName.MyView" android:id="@ id/myView" />
</LinearLayout>
и
<LinearLayout>
<packageName.myView android:id="@ id/myView" />
</LinearLayout>
?
Я создал подкласс EditText, и при установке его в качестве View class=".."
моей активности происходит сбой с ClassCastException при попытке доступа к MyView:
(MyView) myView = (MyView) findViewById(R.id.myView);
При объявлении в качестве второго варианта все работает так, как ожидалось.
Ответ №1:
Я не уверен в этом на 100%, но позвольте мне попробовать. Могло произойти несколько вещей. Анализатор может неправильно понимать class
атрибут (например, он думает, что это часть таблицы стилей). Я не уверен, как анализатор обрабатывает атрибут class, поскольку я никогда не видел и не использовал его (фактически, я также никогда не видел, чтобы <View>
использовался тег). Однако лучшим объяснением может быть следующее: анализатор пытается преобразовать ваш View
в packageName.myView
класс с понижением (преобразование вниз всегда рискованно; преобразование вверх всегда безопасно).
Независимо от того, что происходит, я бы всегда использовал второй вариант, который вы указали, <packageName.myView android:id...>
вместо использования <View>
тега. Причина в том, что использовать <View>
тег излишне. Все в этом XML-файле должно быть представлением (LinearLayout, Button, TextView и т.д. Являются потомками класса View).
Надеюсь, это поможет. Если вам действительно, действительно интересно, вы всегда можете загрузить исходный код для анализатора…
Комментарии:
1. спасибо за ответ. В итоге я всегда использовал второе мнение, хотя в документах Android говорится, что не имеет значения, какое из них вы используете.