Java 为什么可以';将View类型的对象强制转换为KeyboardView

Java 为什么可以';将View类型的对象强制转换为KeyboardView,java,android,android-layout,android-view,Java,Android,Android Layout,Android View,我定义了如下自定义键盘视图: public class MyKeyboardView extends KeyboardView { public MyKeyboardView(Context context, AttributeSet attrs) { super(context, attrs); ... 在我的代码中,我有: MyKeyboardView myKbView = (MyKey

我定义了如下自定义键盘视图:

    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>

为什么?

在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
class。然后尝试将其强制转换为
MyKeyboardView
类。这无法工作,因为类不能强制转换为从其继承的类(类不能强制转换为其子类)。这就是它在Java中的工作方式。

在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
class。然后尝试将其强制转换为
MyKeyboardView
类。这无法工作,因为类不能强制转换为从其继承的类(类不能强制转换为其子类)。这就是它在Java中的工作方式。

看起来您不是在创建
com.parasum.delekey.MyKeyboardView
,而是在创建一个
android.inputmethodservice.KeyboardView

尝试替换布局xml中的行:

<android.inputmethodservice.KeyboardView

看起来您不是在创建
com.parasum.delikey.MyKeyboardView
,而是在创建一个
android.inputmethodservice.KeyboardView

尝试替换布局xml中的行:

<android.inputmethodservice.KeyboardView


android.inputmethodservice.KeyboardView和com.parasum.delikey.MyKeyboardView实际上都是视图的后代,但都不是另一个的后代。它类似于视图和字符串。它们都是Object的后代,但不能在它们之间进行强制转换。

android.inputmethodservice.KeyboardView和com.parasum.delikey.MyKeyboardView确实都是View的后代,但都不是另一个的后代。它类似于视图和字符串。他们都是Object的后代,但你不能在他们之间转换。

为什么?!这两个例子不都是观点吗?@Joseph_Marzbani他们都是。但是你要把它特别地投给
MyKeyboardView
。MyKeyboardView myKbView=(MyKeyboardView)myViewGroup.findViewWithTag(“MyKeyboardView”);谢谢你的快速回复。仅供参考,我的xml在另一个apk中,我无法使用如何将视图对象强制转换为按钮。还记得吗?:Button btn=(Button)findviewbyd()@Joseph_Marzbani您可以这样做,因为您在XML中将此对象声明为
按钮。尝试在XML中声明某个内容为
View
,然后强制转换它。为什么?!这两个例子不都是观点吗?@Joseph_Marzbani他们都是。但是你要把它特别地投给
MyKeyboardView
。MyKeyboardView myKbView=(MyKeyboardView)myViewGroup.findViewWithTag(“MyKeyboardView”);谢谢你的快速回复。仅供参考,我的xml在另一个apk中,我无法使用如何将视图对象强制转换为按钮。还记得吗?:Button btn=(Button)findviewbyd()@Joseph_Marzbani您可以这样做,因为您在XML中将此对象声明为
按钮。尝试在XML中声明某个内容为
View
,然后强制转换它。为什么?!这不是两个视图的实例吗?为什么?!这两个都是观点的例子吗?这是一个很好的答案。我完全明白了。谢谢很遗憾,这不是真的。在代码中,您有
MyKeyboardView扩展了KeyboardView
-MyKeyboardView是KeyboardView的后代。这不是问题所在。老实说,xml文件位于不同的apk文件中。我正在尝试为我的应用程序提供一个主题插件。我很失望:-(我完全不知道为什么我不能强制转换它。根据错误消息,您的Java文件中的KeyboardView似乎是com.parasum.delikey.MyKeyboardView,而XML中的KeyboardView是android.inputmethodservice.KeyboardView。这可能是由您的导入语句的问题引起的。请向我们展示它们。这是一个很好的答案。我完成了伊利明白了。谢谢。很遗憾,这不是真的。在你的代码中,你有
MyKeyboardView扩展了KeyboardView
-MyKeyboardView是KeyboardView的后代。这不是问题所在。老实说,xml文件位于不同的apk文件中。我正试图为我的应用程序提供一个主题插件。我感到失望:-(我完全不知道为什么不能强制转换。根据错误消息,您的Java文件中的KeyboardView似乎是com.parasum.delikey.MyKeyboardView,而XML中的KeyboardView是android.inputmethodservice.KeyboardView。这可能是由于您的导入语句出现问题造成的。请向我们展示它们。