سؤال

عندما أحاول أن findViewById() في طريقة العرض المخصصة الخاصة بي، أستمر في الحصول على ملف ClassCastException.لقد جربت الكثير من الأشياء وأنا متأكد من أنني أخطأت في الكود الآن!

للتأكد من أنني لن أصاب بالجنون، قمت بتجريد الفصول الدراسية إلى الحد الأدنى من أجل العثور على الخطأ.

أنا جديد في برمجة Android وأنا متأكد من أنني أفتقد شيئًا أساسيًا.

هذا هو BaseImageView فئة عرض موسعة.

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

هذا هو LiveImageView امتدادا ل 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);
    }
}

هنا هو التخطيط 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>

وهنا onCreate في نشاطي 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();
    }

أخيرًا، هذا هو تتبع المكدس.

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)
هل كانت مفيدة؟

المحلول

عند استخدام ملفات Layout xml، يجب أن يكون العرض المخصص لديك:

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

علاوة على ذلك، تأكد من تحديد المتغيرين الآخرين للمنشئات لطرق العرض:

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

نظرًا لأن منفاخ التخطيط يحتاج فعليًا إلى متغيرين لإنشاء المثيل.

نصائح أخرى

لقد واجهت هذا من قبل، استخدم أحرف صغيرة <view> بطاقة شعار:

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

هذا من مستندات أندرويد البند 4:

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

حاول تغيير إعلان XML الخاص بك

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

أو يمكن أن يكون بسبب خطأ.

الحل البديل لإصلاح:قم بتعيين بعض قيم "المعرف" الجديدة لـ CustomView في Layout XML وfindViewById().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top