我正在使用Android Studio开发一个android应用程序。 我编写了一个名为“ MyButton”的自定义类,该类扩展了Button。 我也有一个带有几个按钮的资源文件。 在执行时,我得到一个异常,说我不能将Button强制转换为MyButton。 该行是:
myButton = (MyButton) view.findViewById(R.id.button1);
button1是资源文件中声明的Button的ID。 myButton是MyButton类类型的数据。
答案 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"/>