为什么我不能将View类型的对象转换为KeyboardView

时间:2014-03-09 19:32:20

标签: java android android-layout android-view

我已经定义了这样的自定义KeyboardView:

    public class MyKeyboardView extends KeyboardView
    {
        public MyKeyboardView(Context context, AttributeSet attrs)
        {
            super(context, attrs);
            ...

我的代码中的某处:

    MyKeyboardView myKbView = (MyKeyboardView) myViewGroup.findViewWithTag("MyKeyboardView");

其中myViewGroup来自于膨胀以下xml文件:

    <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <android.gesture.GestureOverlayView
        android:id="@+id/gestureOverlayView"
        android:gestureColor="#00000000"
        android:layout_width="match_parent"
        android:tag="MyGestureOverlayView"
        android:layout_height="wrap_content">

        <android.inputmethodservice.KeyboardView
            android:id="@+id/keyboard"
            android:keyBackground="@drawable/orange_keyboard_keys_background"
            android:keyTextColor="#ff8710"
            android:background="#4c4c4c"
            android:tag="MyKeyboardView"
            android:keyTextSize="21sp"
            android:keyPreviewLayout="@layout/key_preview_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    </android.gesture.GestureOverlayView>

</LinearLayout>

这就是Logcat所说的:

    03-09 22:52:29.274: E/deliKey(21719): java.lang.ClassCastException:
    android.inputmethodservice.KeyboardView cannot be cast to
    com.parasum.delikey.MyKeyboardView

WHY吗

3 个答案:

答案 0 :(得分:2)

当您将XML中的视图声明为android.inputmethodservice.KeyboardView时,无法以这种方式进行转换。

您需要更改XML并将其声明为MyKeyboardView

<com.parasum.delikey.MyKeyboardView
        android:id="@+id/keyboard"
        android:keyBackground="@drawable/orange_keyboard_keys_background"
        android:keyTextColor="#ff8710"
        android:background="#4c4c4c"
        android:tag="MyKeyboardView"
        android:keyTextSize="21sp"
        android:keyPreviewLayout="@layout/key_preview_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

您目前将视觉元素声明为KeyboardView类。然后你尝试将它强制转换为MyKeyboardView类。这不能工作,因为类不能转换为从它继承的类(不能将类强制转换为其子类)。这是它在Java中的工作方式。

答案 1 :(得分:2)

您好像没有创建com.parasum.delikey.MyKeyboardView,而是创建android.inputmethodservice.KeyboardView

尝试替换布局xml中的行:

<android.inputmethodservice.KeyboardView

<com.parasum.delikey.MyKeyboardView

答案 2 :(得分:2)

android.inputmethodservice.KeyboardView和com.parasum.delikey.MyKeyboardView确实都是View的后代,但它们都不是另一个的后代。它类似于Views和Strings。它们都是Object的后代,但你不能在它们之间施放。