2011-10-19 14 views
5

Ho appena incontrato un problema durante il tentativo di catturare una vista personalizzata utilizzando findViewById(). La visualizzazione personalizzata viene visualizzata e funziona correttamente. Sfortunatamente, devo essere in grado di modificare alcuni dati visualizzati a piacere, quindi è necessario farlo.Android ClassCastException dopo il recupero della vista personalizzata

mio XML è simile al seguente:

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

so che a volte il problema è che le persone chiamano per sbaglio la componente "Visualizza" nella XML invece della loro sottoclasse di esso.

All'interno metodo onCreate() della mia attività, ho questo:

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

che getta una ClassCastException.

ho deciso di sperimentare un po 'e invece ha cambiato la linea a questo per vedere se ho ancora ricevuto una ClassCastException:

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

Questo funzionava bene, che mi dice che findViewById non ha problemi a darmi una visualizzazione. Ma non vuole darmi un grafico.

Per quanto riguarda la classe Chart, è una sottoclasse di View molto semplice che sembra funzionare correttamente.

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

Probabilmente sto facendo qualcosa di stupido. Ragazzi avete qualche idea? Grazie per l'aiuto!

+0

Il grafico ha costruttori? – Phil

+0

Sì. Il grafico ha tutti e 3 i costruttori. Ho modificato il mio post per mostrarlo. – Schmidget

risposta

3

Solo per curiosità, questo xml viene utilizzato in un altro layout con un tag <include>?

Ho avuto un problema proprio come questo, dove siamo stati tra cui un altro schema XML in un viewflipper con

<include layout="@layout/some_layout.xml"> e stava diventando i widget sbagliate. Ho dovuto avvolgere l'intero layout esterno nei tag <merge></merge> per consentirne l'unione corretta nel layout di base.

Provare a modificare il layout, se è incluso.

<?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: check out this link su come funziona merge

+0

Questo problema è stato risolto! Grazie! – Schmidget

+0

Grazie mille! – ArtemStorozhuk

-1

findViewById restituirà sempre l'oggetto View. Sarai in grado di accedere ai metodi specificati nella classe di visualizzazione e nessuno dei metodi per la tua classe Chart sarà accessibile.

Se è necessario accedere a uno qualsiasi dei metodi o dati specifici del grafico, è necessario eseguire il cast dell'oggetto vista su Chart.

+0

È proprio così. La trasmissione dell'oggetto View a un grafico è ciò che mi dà ClassCastException. – Schmidget

+0

Chart chart = (Chart) findViewById (R.id.chart); Questo causa un'eccezione? Hmm sono confuso perché non dovrebbe causare quell'errore. A volte quando si verificano errori come questo quando sono sicuro che non dovrebbe essere un errore, riapro eclipse e pulisco il progetto. – blessenm

+0

Questo è quello che stavo pensando. Penso che il codice generato sia fallito, il che sembra accadere molto ultimamente. Ogni tanto, codice perfettamente funzionante decide di smettere di funzionare in quanto non riesce più a trovare un pulsante o qualcosa del genere. Ho già pulito il progetto, ma non sembra essere di aiuto. – Schmidget

2

Si tratta molto probabilmente di un bug.

Soluzione alternativa per correggere: utilizzare un nuovo valore "id" per CustomView in XML layout e findViewById().

+0

hai ragione, ha funzionato per me ... grazie –

Problemi correlati