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:
- Android: poner una imagen sobre otra imagen
- ExpandableListView Group View Expand Predeterminado
- Android View.OnKeyListener: haga clic una vez, ejecute dos veces
- ¿Cómo puede saber cuándo se termina de cargar una actividad de Android?
- ¿Cómo encontrar id de la vista en appwidgetprovider?
<?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!
- LAYER_TYPE_SOFTWARE causa que WebView cargue la página en blanco
- Android: cambiar LayoutParams de vista agregado por WindowManager
- Agregar Haga clic en Evento en la lista expandible Vea al nino mientras extiende la actividad en lugar de la actividad?
- Cómo desplegar una parte de la imagen en android
- Android: obtener Viewgroup de la vista?
- Calidad de la animación de rotación de Android
- Android ExpandableListView y onChildClick no funciona
- Onclick en paginador de vista en android no funciona en mi código
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.