Android ClassCastException al recuperar Vista personalizada

Acabo de ejecutar un problema al intentar tomar una vista personalizada utilizando findViewById (). La vista personalizada muestra y funciona correctamente. Por desgracia, tengo que ser capaz de cambiar algunos datos que muestra a voluntad, por lo que tiene que ser hecho.

Mi XML se parece a esto:

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

Sé que a veces el problema es que la gente accidentalmente nombre el componente "Ver" en el XML en lugar de su subclase de la misma.

Dentro del método onCreate () de mi actividad, tengo esto:

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

Que lanza un ClassCastException.

Decidí experimentar un poco y en cambio cambié la línea a esto para ver si todavía recibí un ClassCastException:

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

Esto funcionó bien, lo que me dice que findViewById no tiene problemas para darme una vista. Pero no quiere darme un Gráfico.

En cuanto a la clase Chart va, es una subclase muy simple de View que parece funcionar de otra manera correctamente.

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

Probablemente estoy haciendo algo estúpido. ¿Tienen alguna idea? ¡Gracias por tu ayuda!

Sólo por curiosidad, es que xml que se utiliza en otro diseño con una etiqueta <include> ?

Tuve un problema como este donde estábamos incluyendo otro diseño xml en un viewflipper con

<include layout="@layout/some_layout.xml"> y findviewbyid estaba recibiendo los widgets erróneos. Tuve que envolver todo el diseño externo en <merge></merge> etiquetas para permitir que se fusionen correctamente en el diseño de base.

Trate de cambiar su diseño a este, si está siendo incluido.

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

Editar: echa un vistazo a este enlace acerca de cómo funciona la fusión

Es muy probablemente un error.

Solución para corregir: Utilice un nuevo valor 'id' para el CustomView en XML de diseño y findViewById ().

FindViewById siempre devolverá el objeto View. Sólo podrá acceder a los métodos especificados en la clase view y ninguno de los métodos para su clase Chart será accessbile.

Si necesita acceder a cualquiera de los métodos o datos específicos del gráfico, tendrá que emitir el objeto de vista al gráfico.

  • ¿Equivalente de selectores de clases CSS para las vistas de Android?
  • Determina qué VISTA en varias vistas tiene gesto (doble clic, deslizar hacia la izquierda, deslizar hacia la derecha, etc.)?
  • Android ViewAnimator / ViewFlipper / ViewSwitcher y valor de hardcoded para setDisplayedChild
  • Widgets de Android: Cómo agregar vistas a RemoteViews en tiempo de ejecución
  • ListView muestra imágenes incorrectas y duplicadas
  • Actualizando ExpandableListView con notifyDataSetChanged ()
  • Fragmento de la fuerza de Android para reconstruir Ver
  • ¿Cómo encadenar la animación en android a la misma vista?
  • Tamaño de imagen dinámico para android
  • android setAlpha lento
  • Custom ExpandableListview Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.