Android ClassCastException при получении пользовательского представления

Я просто столкнулся с проблемой при попытке захватить пользовательский вид с помощью findViewById (). Пользовательский вид в противном случае отображается и работает правильно. К сожалению, мне нужно иметь возможность изменять некоторые данные, которые он отображает по своему усмотрению, поэтому это нужно сделать.

Мой XML выглядит так:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.TheProject.TheApp.Chart android:id="@+id/chart" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 

Иногда я знаю, что люди случайно называют компонент «Просмотр» в XML вместо своего подкласса.

Внутри метода onCreate () моей активности у меня есть следующее:

 myChart=(Chart)findViewById(R.id.chart); //where myChart is an object of type Chart 

Это вызывает исключение ClassCastException.

Я решил немного поэкспериментировать и вместо этого изменил строку на это, чтобы узнать, получил ли еще класс ClassCastException:

 View chart=(View)findViewById(R.id.chart); 

Это отлично работает, что говорит мне, что findViewById не имеет проблем с предоставлением мне View. Но он не хочет давать мне диаграмму.

Что касается класса Chart, это действительно простой подкласс View, который, как представляется, работает некорректно.

 public class Chart extends View{ public Chart(Context context) { super(context); init(); } public Chart(Context context, AttributeSet attrs) { super(context, attrs); init(); } public Chart(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } /* More stuff below like onDraw, onMeasure, setData, etc. */ } 

Я, наверное, просто делаю что-то глупое. У вас есть идеи? Спасибо за вашу помощь!

Просто из любопытства, заключается в том, что xml используется в другом макете с <include> ?

У меня была проблема точно так же, когда мы включали еще один макет xml в viewflipper с

<include layout="@layout/some_layout.xml"> и findviewbyid получал неправильные виджеты. Мне пришлось обернуть весь внешний макет в тегах <merge></merge> чтобы он мог корректно слиться с базовым макетом.

Попробуйте изменить свой макет на это, если он включен.

 <?xml version="1.0" encoding="utf-8"?> <merge> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.TheProject.TheApp.Chart android:id="@+id/chart" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> </merge> 

Edit: ознакомьтесь с этой ссылкой о том, как работает слияние

Скорее всего, это ошибка.

Обходное решение для исправления: используйте новое значение «id» для CustomView в формате Layout XML и findViewById ().

FindViewById всегда будет возвращать объект View. Вы сможете получить доступ только к методам, указанным в классе представления, и ни один из методов класса Chart не будет доступен.

Если вам нужно получить доступ к каким-либо конкретным методам или данным диаграммы, вам нужно будет отобразить объект вида в Chart.

Intereting Posts
Как игнорировать новые поля для объектной модели с Firebase 1.0.2 Файл «elf.h» не найден при компиляции ядра Android для Nexus 7 в Mac OS X Каков наилучший способ обнаружения поддержки websocket с помощью Javascript? Listview: Как оставаться выделенным / выбранным после нажатия кнопки «Назад»? Как автоматически увеличить автоматически текущее местоположение в карте Google api для Android? Как пропустить первую строку в оформлении элементов RecyclerView для GridLayout? Конфликт с пакетом android – Amazon SNS Sencha touch messagebox unclickable Демоверсии API SDK для Android Перезапуск в режиме TCP порт 5555 зависает adb TextView StringIndexOutOfBoundsException и IndexOutOfBoundsException сбой в processToSupportEmoji Проблема с расширением многоуровневого ExpandableListView Как удалить несколько узлов по одному запросу в firebase? IsolatedContext против AndroidTestCase.getContext () Как сделать скриншот другого приложения программно без разрешения root, например, Скриншот UX Trial?