在Button和扩展Button的自定义类MyButton之间进行转换时出错

时间:2018-12-24 12:06:12

标签: android android-layout

我正在使用Android Studio开发一个android应用程序。 我编写了一个名为“ MyButton”的自定义类,该类扩展了Button。 我也有一个带有几个按钮的资源文件。 在执行时,我得到一个异常,说我不能将Button强制转换为MyButton。 该行是:

myButton = (MyButton) view.findViewById(R.id.button1);

button1是资源文件中声明的Button的ID。 myButton是MyButton类类型的数据。

5 个答案:

答案 0 :(得分:1)

您不能执行此操作。

因为您使用Button创建了MyButton。 Button是独立的,但MyButton取决于Button。当您声明

MyButton button = (Button) findByElementById()

这会导致编译器错误。。因为编译器知道MyButton是一个Button,所以Button不是MyButton。

但是你可以这样做

Button button = new MyButton()

因为MyButton()是一个Button()

Button button = (Button) new MyButton() 

但是这里您不需要将MyButton()强制转换为Button(),因为编译器已经知道MyButton()是Button()

在Java中,您只能进行Upcasting和Downcasting。看看Java向下转换和向上转换规则,这些规则将使您更加清晰

答案 1 :(得分:1)

除了执行此强制转换之外,您还可以执行以下操作:

首先,您的MyButton类必须使用此构造函数:

MyButton(Context context, AttributeSet attrs)

然后在布局中使用自定义按钮:

<com.mypackagename.MyButton
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

最后,您可以参考自定义按钮

MyButton button = findViewById(R.id.button);

答案 2 :(得分:0)

从API 26开始,findViewById()使用推断为其返回类型,因此您无需进行强制转换。您可以使用以下代码创建对象

MyButton myButton = (MyButton) view.findViewById(R.id.buttonCoureur1);

答案 3 :(得分:0)

您可以像这样进行投射:

public class MyButton extends android.support.v7.widget.AppCompatButton {

    public MyButton(Context context) {
        super(context);
    }
}

MyButton myButton = findViewById(R.id.my_button);
上面的

API级别26不需要强制类型声明。只要子类仍然保持构造函数必须属于父类,就不会有错误

答案 4 :(得分:0)

由于您没有附加布局源(XML),所以不确定您是否使用自定义MyButton类来创建类似 R.id.button1 的按钮>。您应该在布局XML中执行以下操作:

<your-package-name.MyButton
    android:id="@+id/button1"
    android:text="Coureur 1"
    android:clickable="true"
    android:text="Your button title"/>