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() моей Activity у меня есть это:

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. */
}

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


person Schmidget    schedule 19.10.2011    source источник
comment
Есть ли в Chart конструкторы?   -  person Phil    schedule 19.10.2011
comment
Да. Диаграмма имеет все 3 конструктора. Я отредактировал свой пост, чтобы показать их.   -  person Schmidget    schedule 19.10.2011


Ответы (3)


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

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

<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>

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

person xdumaine    schedule 19.10.2011

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

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

person M. Usman Khan    schedule 27.03.2014

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

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

person blessenm    schedule 19.10.2011
comment
Вот именно. Приведение этого объекта View к диаграмме дает мне ClassCastException. - person Schmidget; 19.10.2011
comment
Диаграмма chart=(Chart)findViewById(R.id.chart); Это вызывает исключение? Хм, я смущен, так как это не должно вызывать эту ошибку. Иногда, когда возникают такие ошибки, когда я уверен, что это не ошибка, я снова открываю eclipse и очищаю проект. - person blessenm; 19.10.2011
comment
Вот о чем я думал. Я думаю, что сгенерированный код напортачил, что, кажется, часто происходит в последнее время. Время от времени идеально работающий код решает перестать работать, поскольку больше не может найти кнопку или что-то в этом роде. Я уже очистил проект, но это не помогло. - person Schmidget; 19.10.2011
comment
Что ж, попробуйте удалить проект из eclipse. А затем создайте новый проект Android из существующего источника. Или вам может понадобиться повозиться с кодом, например, изменить имя файла. Или попробуйте создать небольшой тестовый проект только с пользовательским представлением и посмотрите, возникает ли по-прежнему исключение. - person blessenm; 19.10.2011