2011-10-19 28 views
5

Acabo de encontrarme con un problema al intentar obtener una Vista personalizada utilizando findViewById(). La vista personalizada de lo contrario se muestra y funciona correctamente. Lamentablemente, necesito poder cambiar algunos datos que muestra a voluntad, por lo que debe hacerse.Android ClassCastException al recuperar Vista personalizada

Mi XML tiene el siguiente aspecto:

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

veces sé que el problema es que la gente accidentalmente nombrar el componente "Ver" en el XML en lugar de su subclase de ella.

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

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

que arroja un ClassCastException.

decidí experimentar un poco y en su lugar ha cambiado la línea a esto para ver si todavía recibimos una ClassCastException:

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

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

En lo que se refiere a la clase Chart, es una subclase de View realmente simple que parece funcionar 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!

+0

¿Tiene el gráfico constructores? – Phil

+0

Sí. Chart tiene los 3 constructores. He editado mi publicación para mostrarlos. – Schmidget

Respuesta

3

Solo por curiosidad, ¿ese xml se usa en otro diseño con una etiqueta <include>?

tuve un problema como este donde nos incluyendo otro diseño xml en un viewflipper con

<include layout="@layout/some_layout.xml"> y era conseguir los widgets de equivocadas. Tuve que envolver todo el diseño externo en las etiquetas <merge></merge> para permitir que se combine correctamente en el diseño base.

Intente cambiar su diseño a este, si se incluye.

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

edición: la salida this link acerca de cómo funciona la fusión

+0

¡Esto lo arregló! ¡Gracias! – Schmidget

+0

¡Muchas gracias! – ArtemStorozhuk

-1

findViewById siempre devolverá el objeto View. Solo podrá acceder a los métodos especificados en la clase de vista y ninguno de los métodos para su clase de Chart será accessbile.

Si necesita acceder a cualquiera de los métodos o datos específicos del gráfico, deberá convertir el objeto de vista a Chart.

+0

Eso es todo. Lanzar ese objeto View a un Chart es lo que me da la ClassCastException. – Schmidget

+0

Chart chart = (Chart) findViewById (R.id.chart); Esto causa una excepción? Hmm Estoy confundido ya que no se supone que cause ese error. A veces, cuando ocurren errores como este cuando estoy seguro de que no debería haber un error, reabro el eclipse y limpio el proyecto. – blessenm

+0

Eso es lo que estaba pensando. Creo que el código generado se estropeó, lo que parece estar sucediendo mucho últimamente. De vez en cuando, el código que funciona perfectamente decide dejar de funcionar porque ya no puede encontrar un botón o algo así. Ya limpié el proyecto, pero no pareció ayudar. – Schmidget

2

Es más probable que un error.

Solución alternativa a solucionar: utilice un nuevo valor 'id' para CustomView en Layout XML y findViewById().

+0

tienes razón, trabajado para mí ... gracias –

Cuestiones relacionadas