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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top