CastClassException en vista personalizada

Cuando intento findViewById() en mi opinión de encargo findViewById() el conseguir de un ClassCastException . He intentado tantas cosas que estoy seguro que he estropeado el código ahora!

Para asegurarse de que no me estoy volviendo loco me despojé de las clases a su mínimo inorder mínimo para encontrar lo que estaba mal.

Soy nuevo en la programación de Android y estoy seguro de que estoy perdiendo algo básico.

Esto es BaseImageView una clase de vista extendida.

 package com.company.product.client.android.gui.views; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.view.View; public class BaseImageView extends View { public BaseImageView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.GREEN); } } 

Esta es LiveImageView una extensión de la clase BaseImageView .

 package com.company.product.client.android.gui.views; import android.content.Context; import android.util.AttributeSet; public class LiveImageView extends BaseImageView { public LiveImageView(Context context, AttributeSet attrs) { super(context); } } 

Aquí está el Layout my_view.xml .

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> <View class="com.company.product.client.android.gui.views.LiveImageView" android:id="@+id/lvImage" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

Y aquí está el onCreate en mi Activity LiveViewActivity .

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { setContentView(R.layout.my_view); final LiveImageView lvImage = (LiveImageView) findViewById(R.id.lvImage); } catch (final Exception e) { Log.e(TAG, "onCreate() Exception: " + e.toString()); e.printStackTrace(); } 

Finalmente, esto es un seguimiento de pila.

 02-11 17:25:24.829: ERROR/LiveViewActivity(1942): onCreate() Exception: java.lang.ClassCastException: android.view.View 02-11 17:25:24.839: WARN/System.err(1942): java.lang.ClassCastException: android.view.View 02-11 17:25:24.839: WARN/System.err(1942): at com.company.product.client.android.gui.screen.LiveViewActivity.onCreate(LiveViewActivity.java:26) 02-11 17:25:24.839: WARN/System.err(1942): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 02-11 17:25:24.849: WARN/System.err(1942): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 02-11 17:25:24.849: WARN/System.err(1942): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 02-11 17:25:24.849: WARN/System.err(1942): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 02-11 17:25:24.849: WARN/System.err(1942): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 02-11 17:25:24.859: WARN/System.err(1942): at android.os.Handler.dispatchMessage(Handler.java:99) 02-11 17:25:24.859: WARN/System.err(1942): at android.os.Looper.loop(Looper.java:123) 02-11 17:25:24.859: WARN/System.err(1942): at android.app.ActivityThread.main(ActivityThread.java:4363) 02-11 17:25:24.869: WARN/System.err(1942): at java.lang.reflect.Method.invokeNative(Native Method) 02-11 17:25:24.869: WARN/System.err(1942): at java.lang.reflect.Method.invoke(Method.java:521) 02-11 17:25:24.869: WARN/System.err(1942): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 02-11 17:25:24.869: WARN/System.err(1942): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 02-11 17:25:24.879: WARN/System.err(1942): at dalvik.system.NativeStart.main(Native Method) 

Cuando se utiliza en archivos XML de diseño, la vista personalizada debe ser:

 <com.company.product.client.android.gui.views.LiveImageView android:layout_width="..." ... /> 

Además, asegúrese de definir las otras dos variantes de constructores para las vistas:

 public BaseImageView(Context, AttributeSet); public BaseImageView(Context, AttributeSet, int); 

Dado que el inflador de diseño realmente necesita que dos variantes para crear la instancia.

He funcionado en esto antes, uso una etiqueta <view> minúscula:

<view class="com.company.product.client.android.gui.views.LiveImageView" ... />

Esto es de los docs de Android tema 4:

<view class="com.android.notepad.NoteEditor$MyEditText" id="@+id/note" ...

Intente cambiar su declaración XML

  <com.company.product.client.android.gui.views.LiveImageView android:id="@+id/lvImage" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

O puede ser debido a un error.

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

  • Usabilidad de BoringLayout
  • El constructor de vista personalizada no se llama a android 5.0.2
  • ImageViews son invisibles si el método dispatchDraw de Viewgroups se sobrescribe en android
  • Cómo fijar la aplicación no responde?
  • SherlockActionBar: Cómo ajustar CustomView contra actionBar
  • Lazy carga de GridView con imágenes de descarga de Internet
  • Cómo Canvas.drawText () realmente dibuja el texto?
  • Barra de herramientas extendida con vista personalizada que no se muestra con ancho completo
  • Cómo inclinar un diseño infantil en algún ángulo
  • Restaurar estado de vista antes de aplicar atributos XML
  • Visor dinámico de altura
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.