пользовательский вид, объявленный в xml

#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 говорится, что не имеет значения, какое из них вы используете.