Android Imagebutton 点击更改图片

38

我刚刚在res文件夹下添加了一个新的drawable文件夹。在drawable文件夹中,我从drawable-hdpi文件夹中复制了ic_launcher.png文件。 当我按下按钮时,我想通过新图像更改标准ImageButton的图像。我编写了一些代码,但启动应用程序后它会崩溃。

Button imgButton; 

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    findViewById(R.id.imgButton).setOnClickListener(imgButtonHandler);      
}

View.OnClickListener imgButtonHandler = new View.OnClickListener() {

    public void onClick(View v) {

        imgButton.setBackgroundResource(R.drawable.ic_launcher);

    }
};

编辑:我改成了这样,但仍然不起作用。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    imgButton = (Button) findViewById(R.id.imgButton);
    imgButton.setOnClickListener(imgButtonHandler);
}


View.OnClickListener imgButtonHandler = new View.OnClickListener() {

    public void onClick(View v) {
        imgButton.setBackgroundResource(R.drawable.ic_launcher);

    }
};

编辑2:这个有效。感谢所有人。

ImageButton button;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button= (ImageButton)findViewById(R.id.imgButton);
    button.setOnClickListener(imgButtonHandler);
}


View.OnClickListener imgButtonHandler = new View.OnClickListener() {

    public void onClick(View v) {
        button.setBackgroundResource(R.drawable.ic_launcher);

    }
};

你应该在这里粘贴来自logcat的错误信息。 - hsz
NullpointerException 因为 imgButton 为空...你可以将 View v 强制转换为 Button 或在 setContentView 后设置 imgButton。 - Selvin
你的修改就是我的答案,而且它有效! - Carnal
唯一的情况是不起作用的,就是如果您的id不是“imgButton”(R.id.imgButton)。 - Carnal
当没有被点击时,我该如何将它设置为不同的图像。 - wesley franks
7个回答

70
这使我有些误解 - 应该使用setImageResource而不是setBackgroundResource :) !!

以下代码可以正常工作:

ImageButton btn = (ImageButton)findViewById(R.id.imageButton1);       
 btn.setImageResource(R.drawable.actions_record);

当使用 setBackgroundResource 时,实际的 imagebutton 图像保持不变,而背景图像被更改,导致 imageButton 对象外观丑陋。

谢谢。


正确;使用setBackgroundResource似乎会拉伸图像以适应按钮,因此它看起来会变形。 - TheLettuceMaster

16
<ImageButton android:src="@drawable/image_btn_src" ... />

image_btn_src.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/icon_pressed"/>
<item android:state_pressed="false" android:drawable="@drawable/icon_unpressed"/>
</selector>

10

那是因为imgButton为空。 请尝试使用以下代码:

findViewById(R.id.imgButton).setBackgroundResource(R.drawable.ic_action_search);

或者更易于阅读:

imgButton = (Button) findViewById(R.id.imgButton);
imgButton.setOnClickListener(imgButtonHandler);

在 onClick 中:

imgButton.setBackgroundResource(R.drawable.ic_action_search);

findViewById(R.id.imgButton).setBackgroundResource(R.drawable.ic_launcher); 哈...这个有效。当我开始它时,它有了新的图片。然后我不明白,为什么上面的代码在onClick中不起作用? - user1205415
它不起作用,因为你已经声明了一个按钮imgButton,但是你没有将其初始化为视图。这就是为什么无法工作的原因。当使用findViewById(...)时,您可以获取Button的视图(在此情况下),因此它可以工作。 - Carnal
看我的答案,伙计,我为你放在那里了。 - Carnal

3
你可以直接在XML文件中进行操作:

您可以直接在XML文件中进行操作:

android:onClick="@drawable/ic_action_search"

好的,但是当我再次点击按钮时,我想要旧图像。就像一个切换按钮。 - user1205415
3
但是这样做并不能改变图像,反而会导致活动崩溃并显示日志 ' java.lang.IllegalStateException: 在 com.test.MainMenu 活动类中无法找到方法 res/drawable-hdpi/menu_mission_touch.png(View) ,用于处理 android.widget.ImageButton 的 id 为 'menu_mission' 的视图上的 onClick 事件处理程序。' - elixir bash
不可能的! - Jorgesys

3
当点击ImageButton时,我使用了一个布尔值来在不同的图像之间切换,代码如下:
ImageButton imageButton;
boolean buttonOn;

imageButton.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         if (!buttonOn) {
             buttonOn = true;
             imageButton.setBackground(getResources().getDrawable(R.drawable.button_is_on)); 
         } else {
             buttonOn = false;
             imageButton.setBackground(getResources().getDrawable(R.drawable.button_is_off));
         }
     }
});

你好...假设我正在执行这个活动。用户点击发光图像...如果用户从一个活动转到另一个活动,再次返回到活动一,按钮是否仍然保持发光状态? - Wini
只有当您将按钮状态传递到另一个活动并在返回此活动时检索它时,才需要使用@Wini。 - Oksana Kryvenko

2

您已经将按钮分配给变量imgButton

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    imgButton = (Button) findViewById(R.id.imgButton);
    imgButton.setOnClickListener(imgButtonHandler);
}

1

这非常简单

public void onClick(View v) {

        imgButton.setImageResource(R.drawable.ic_launcher);

    }

使用set Background image resource可以更改按钮的背景。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接