Domanda

Quando ci provo findViewById() nella mia visualizzazione personalizzata continuo a ricevere un file ClassCastException.Ho provato così tante cose che sono sicuro di aver sbagliato il codice ora!

Per essere sicuro di non impazzire ho ridotto le lezioni al minimo indispensabile per trovare cosa c'era che non andava.

Sono nuovo nella programmazione Android e sono sicuro che mi manca qualcosa di fondamentale.

Questo è BaseImageView una classe di visualizzazione estesa.

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);
    }
}

Questo è LiveImageView un'estensione del BaseImageView classe.

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);
    }
}

Ecco la disposizione 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>

Ed ecco onCreate nella mia attività 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();
    }

Infine, questa è l'analisi dello stack.

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)
È stato utile?

Soluzione

Quando si utilizzano file XML di layout, la visualizzazione personalizzata dovrebbe essere:

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

Inoltre, assicurati di definire le altre due varianti di costruttori per le visualizzazioni:

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

Poiché il gonfiatore del layout ha effettivamente bisogno di due varianti per creare l'istanza.

Altri suggerimenti

Mi sono imbattuto in questo prima, usa una minuscola <view> etichetta:

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

Questo viene da I documenti di Android punto 4:

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

Prova a cambiare la tua dichiarazione XML

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

Oppure può essere dovuto a un bug.

Soluzione alternativa per risolvere:Assegna un nuovo valore 'id' per CustomView in Layout XML e findViewById().

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