Пользовательский вид объявлен в XML - PullRequest
2 голосов
/ 11 ноября 2011

При объявлении пользовательского представления в 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 Ответ

0 голосов
/ 26 ноября 2011

Я не уверен на 100% в этом, но позвольте мне попробовать. Пара вещей может происходить. Синтаксический анализатор может неправильно понимать атрибут class (например, он считает, что он является частью таблицы стилей). Я не уверен, как синтаксический анализатор обрабатывает атрибут класса, так как я никогда не видел и не использовал его (фактически, я никогда не видел, чтобы использовался также тег <View>). Лучшее объяснение, однако, может быть следующим: анализатор пытается преобразовать ваш View в класс packageName.myView и терпит неудачу (понижающее приведение всегда рискованно; повышающее приведение всегда безопасно).

Независимо от того, что происходит, я бы всегда использовал второй вариант, который вы перечислили, <packageName.myView android:id...>, вместо тега <View>. Причина в том, что использование тега <View> является излишним. Все в этом XML-файле должно быть представлением (LinearLayout, Button, TextView и т. Д. Являются потомками класса View).

Надеюсь, это поможет. Если вам действительно очень интересно, вы всегда можете скачать исходный код для парсера ...

...