Android ClassCastException при получении пользовательского представления - PullRequest
5 голосов
/ 19 октября 2011

Я только что столкнулся с проблемой при попытке получить пользовательский вид с помощью 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. */
}

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

Ответы [ 3 ]

3 голосов
/ 19 октября 2011

Просто из любопытства, этот 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>

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

2 голосов
/ 27 марта 2014

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

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

0 голосов
/ 19 октября 2011

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

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

...