CastClassException على طريقة العرض المخصصة
-
12-11-2019 - |
سؤال
عندما أحاول أن 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().