ClassCastException Android su di recupero di visualizzazione personalizzata
-
26-10-2019 - |
Domanda
Ho appena eseguito in un problema quando si tenta di afferrare una visualizzazione personalizzata utilizzando findViewById (). La visualizzazione personalizzata altrimenti display e funzioni correttamente. Purtroppo, ho bisogno di essere in grado di modificare alcuni dati vengono visualizzati a piacimento, in modo che deve essere fatto.
I miei sguardi XML come questo:
<?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 la gente accidentalmente il nome della 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
Questo 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 bene ha funzionato, che mi dice che non ha problemi findViewById darmi una visualizzazione. Ma non vuole darmi un grafico.
Per quanto riguarda la classe Grafico va, è davvero semplice sottoclasse di vista che sembra altrimenti funzionano 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 solo facendo qualcosa di stupido. Voi ragazzi avete qualche idea? Grazie per il vostro aiuto!
Soluzione
Solo per curiosità, è che XML utilizzata in un altro layout con un tag <include>
?
Ho avuto un problema proprio come questo, dove siamo stati tra cui un altro xml layout in un viewflipper con
<include layout="@layout/some_layout.xml">
e findviewbyid
stava diventando i widget sbagliate. Ho dovuto avvolgere l'intero layout esterno nei tag <merge></merge>
per permettergli di unire correttamente nel layout di base.
Provare a cambiare il layout a questo, se è in fase di 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>
modifica questo link su come funziona merge
Altri suggerimenti
Si tratta molto probabilmente di un bug.
Soluzione Per risolvere il problema:. Usa qualche nuovo valore 'id' per la CustomView in Layout XML e findViewById ()
findViewById restituirà sempre l'oggetto View. Lei sarà solo in grado di metodi di accesso specificati nella classe di visualizzazione e nessuno dei metodi per la classe grafico sarà accessbile.
Se avete bisogno di accedere a qualsiasi dei metodi specifici di grafico o dati è necessario il cast dell'oggetto vista Chart.