Android ImageButton无参构造报错,如何正确初始化实现点击切换背景图?
问题原因分析
- 报错
Cannot resolve constructor 'ImageButton()'的直接原因:ImageButton类没有无参构造方法,必须传入Context类型参数才能实例化。更关键的是你完全不需要手动new控件,xml中已经声明渲染的按钮不需要重新创建实例,你new出来的新对象和界面上显示的按钮没有任何关联,就算实例化成功也不会生效。 - 你要修改的是
android:background属性,所以不能用setImageResource,要改用setBackgroundResource方法,如果是修改android:src属性才用前者。
正确实现代码
修改后的MainActivity.java代码
package com.example.imageButtonTest; import androidx.appcompat.app.AppCompatActivity; import android.view.View; import android.os.Bundle; import android.widget.ImageButton; public class MainActivity extends AppCompatActivity { // 状态标记,用来实现两张背景图来回切换 private boolean isShowDefaultBg = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void foo(View v) { // onClick回调的参数v就是你点击的ImageButton本身,直接强转即可使用 if(v.getId() == R.id.image_1) { ImageButton myButton = (ImageButton) v; if (isShowDefaultBg) { // 切换为第二张图,替换为你自己的drawable资源名即可 myButton.setBackgroundResource(R.drawable.imageName); } else { // 切回默认的初始背景图 myButton.setBackgroundResource(R.drawable.image_1); } // 翻转状态,下次点击切换到另一张图 isShowDefaultBg = !isShowDefaultBg; } } }
额外可选写法
如果你需要在foo方法之外的其他地方访问这个ImageButton,可以在onCreate中提前绑定控件:
// 声明为全局变量 private ImageButton myButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 通过id绑定xml中定义的控件 myButton = findViewById(R.id.image_1); }
内容的提问来源于stack exchange,提问作者Dracep
相关产品推荐
相关产品推荐

