2011-10-19 20 views
5

Po prostu napotkano problem przy próbie pobrania niestandardowego widoku za pomocą findViewById(). Widok niestandardowy wyświetla się i działa poprawnie. Niestety, muszę mieć możliwość zmiany niektórych danych wyświetlanych do woli, więc trzeba to zrobić.Wyjątek ClassCastException systemu Android po pobraniu niestandardowego widoku

Moje XML wygląda następująco:

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

wiem czasami problem jest to, że ludzie przypadkowo nazwa komponentu „Widok” w XML zamiast ich podklasy niego.

Wewnątrz metody Moja aktywność w onCreate(), mam to:

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

To rzuca ClassCastException.

postanowiłem poeksperymentować trochę i zamiast zmienił linię do tego, aby sprawdzić, czy nadal otrzymaliśmy ClassCastException:

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

To działało w porządku, który mówi mi, że findViewById ma dziś daje mi View. Ale nie chce mi dać wykresu.

Jeśli chodzi o klasę wykresów, to jest to naprawdę prosta podklasa widoku, która wydaje się działać poprawnie.

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

Prawdopodobnie robię coś głupiego. Czy macie jakieś pomysły? Dzięki za pomoc!

+0

Czy wykres zawiera konstruktory? – Phil

+0

Tak. Wykres ma wszystkie 3 konstruktory. Zmodyfikowałem mój post, aby je pokazać. – Schmidget

Odpowiedz

3

Po prostu z ciekawości, czy xml jest używany w innym układzie z tagiem <include>?

miałem problem, podobnie jak to, gdzie byliśmy w tym inny układ xml w viewflipper z

<include layout="@layout/some_layout.xml"> i trafiałem źle widgety. Musiałem zawinąć cały układ zewnętrzny w znaczniki <merge></merge>, aby umożliwić prawidłowe scalenie z układem podstawowym.

Spróbuj zmienić układ, jeśli jest uwzględniany.

<?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: Wyjazd this link o tym, jak działa seryjnej

+0

Naprawiono to! Dzięki! – Schmidget

+0

Dziękuję bardzo! – ArtemStorozhuk

-1

findViewById zawsze zwróci obiekt View. Będziesz mieć dostęp tylko do metod określonych w klasie widoku i żadna z metod dla twojej klasy Chart nie będzie accessbile.

Jeśli potrzebujesz dostępu do którejś z metod lub danych specyficznych dla wykresu, musisz odrzucić obiekt widoku do wykresu.

+0

Po prostu to. Przesyłanie tego obiektu widoku do wykresu daje mi wyjątek ClassCastException. – Schmidget

+0

Wykres wykresu = (wykres) findViewById (R.id.chart); To powoduje wyjątek? Hmm jestem zdezorientowany, ponieważ nie powinien powodować tego błędu. Czasami, gdy takie błędy występują, gdy jestem pewien, że to nie powinien być błąd, ponownie otwieram zaćmienie i czyścimy projekt. – blessenm

+0

Tak właśnie myślałem. Myślę, że wygenerowany kod spieprzył się, co ostatnio zdarza się bardzo często. Co jakiś czas doskonale działający kod decyduje się przestać działać, ponieważ nie może już znaleźć przycisku ani czegoś takiego. Oczyściłem już projekt, ale nie pomogło. – Schmidget

2

Jest to najprawdopodobniej błąd.

Obejście problemu: Użyj nowej wartości "id" dla CustomView w Layout XML i findViewById().

+0

masz rację, pracowałeś dla mnie ... dzięki –

Powiązane problemy