如何保持图像按钮处于按下状态并显示按下状态的可绘制对象

How to keep imagebutton in pressed state and display the drawable for pressed state

XML:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:drawable="@drawable/vopressed" /> //light blue
    <item android:state_selected="true" android:drawable="@drawable/voselected" /> //blue
    <item android:drawable="@drawable/vo" /> //black
</selector>

XML:

<ImageButton
        android:layout_width="0dp"
        android:layout_weight="0.2"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/vo_selector"
        android:id="@+id/ibS"
        android:background="@android:color/transparent" />

我正在尝试在点击时更改为浅蓝色,然后更改为深蓝色。

ibS.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ibS.setPressed(true);
        Toast.makeText(MainActivity.this, "clicked", Toast.LENGTH_LONG).show();
    }
});

我怎样才能让它在我点击它时保持 pressed/selected 状态并且可绘制对象从黑色变为蓝色,当我再次点击它时它 unpresses/unselects 本身和变回黑色。

ibS.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
          ibS.setBackground(ContextCompat.getDrawable(your Context,R.drawable.voselected));
        Toast.makeText(MainActivity.this, "clicked", Toast.LENGTH_LONG).show();
    }
});

使用按钮而不是图像按钮,因为在这种情况下您将需要两个图像资源。

使用可绘制对象:

按钮未按下状态:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke android:width="2dp" android:color="@color/colorPrimary" />
    <padding android:left="10dp"
        android:top="10dp"
        android:right="10dp"
        android:bottom="10dp" />
    <solid android:color="@color/colorPrimary" />
</shape>

按钮按下状态:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke android:width="2dp" android:color="@color/colorPrimaryDark" />
    <padding android:left="10dp"
        android:top="10dp"
        android:right="10dp"
        android:bottom="10dp" />
    <solid android:color="@color/colorPrimaryDark" />
</shape>

现在在需要的时候设置上面的drawable。

当您从按钮上移开手指时,按下状态将始终重置为 false,因此您无法使用该状态。 您应该通过声明成员变量

直接跟踪您的状态
private boolean isPressed = false;

那你在点击按钮的时候直接设置图片按钮的背景

ibS.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        isPressed = !isPressed;
        if (isPressed) {
            ibS.setBackgroundColor(R.color.your_blue_color);
            //use code below if you want to use drawable background
            //ibS.setBackgroundResource(R.drawable.background_pressed);
        } else {
            ibS.setBackgroundColor(R.color.your_black_color);
            //use code below if you want to use drawable background
            //ibS.setBackgroundResource(R.drawable.background_normal);
        }
    }
});

您可以尝试使用可绘制对象的选定状态::

ibS.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
    ibS.setPressed(true);
    Toast.makeText(MainActivity.this, "clicked", Toast.LENGTH_LONG).show();
}});

将行 ibS.setPressed(true); 更改为 ibS.setSelected(!ibs.isSelected());

所以,它会将图像的 drawble 更改为 selected_state 在 drawable 中定义的图像,并将选中的状态也放在...再次单击时...它将恢复上次的状态... 试试这个..