Cast自定义View子类时的ClassCastException

时间:2010-05-23 14:50:17

标签: android

我遇到了Android开发的早期问题。我已经制作了自己的自定义视图(效果很好)。一开始我只是以编程方式将它添加到布局中,但我想我可以尝试将其放入XML布局中(为了保持一致性)。

所以我得到的是:

main.xml中:

[...]
<sailmeter.gui.CompassView
android:id="@+id/compassview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/widget55"
android:background="@color/white"
/>
[...]

CompassView.java:

public class CompassView extends View { 
protected void onDraw(Canvas canvas) { [...] }
public void setBearing(float bearing) { [...] }
}

SailMeter.java(活动类):

public class SailMeter extends Activity implements PropertyChangeListener {

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
compassview = (CompassView) findViewById(R.id.compassview1); //Line 51 in SailmMeter.java
[...]
}
}

(显然更多,但你明白了)

现在,这是堆栈跟踪:

05-23 16:32:01.991: ERROR/AndroidRuntime(10742): Uncaught handler: thread main exiting due to uncaught exception  
05-23 16:32:02.051: ERROR/AndroidRuntime(10742): java.lang.RuntimeException: Unable to start activity ComponentInfo{sailmeter.gui/sailmeter.gui.SailMeter}:   java.lang.ClassCastException: android.view.View
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.ActivityThread.access$2200(ActivityThread.java:126)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.os.Looper.loop(Looper.java:123)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.ActivityThread.main(ActivityThread.java:4595)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at java.lang.reflect.Method.invokeNative(Native Method)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at java.lang.reflect.Method.invoke(Method.java:521)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at dalvik.system.NativeStart.main(Native Method)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742): Caused by: java.lang.ClassCastException: android.view.View
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at sailmeter.gui.SailMeter.onCreate(SailMeter.java:51)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     ... 11 more

为什么我无法投射自定义视图?我需要它是那种类型,因为它有一些我想要访问的额外方法。我应该重组它并让另一个类处理逻辑,然后让视图成为一个视图吗?我真的很喜欢这个工作。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我以前做过这个,发现有必要使用LayoutInflater。也许你可以尝试这样的事情:

public CompassView( Context context, AttributeSet attributeSet ) 
{
    super( context, attributeSet );

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate( R.layout.name_of_your_compass_view_layout_file, this );
}

答案 1 :(得分:1)

为大家欢呼!

我不知道是什么导致了它,但我最终关闭了eclipse,刷新了所有文件然后我注意到xml仍然将它定义为视图,而不是指南针视图。所以我改变了(并修复了一些其他错误)然后它工作了。

感谢您的帮助!

答案 2 :(得分:0)

要解决的解决方法:分配一些新的ID&#39;布局XML中的CustomView的值和findViewById()。

这很可能是一个错误。