Android - 比较按钮背景与资源

Android - compare between button background to Resource

我正在尝试比较按钮背景和资源文件。 例如,我有按钮

按钮

        <Button
        android:id="@+id/btnGenre"
        android:layout_width="110dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="16dp"
        android:background="@drawable/frame_genre"
        android:text="POST"
        android:padding="16dp"
        android:focusable="true"
        android:clickable="true"/>

后台有drawable/frame_genre。我正在尝试将此背景与 Resouce 文件进行比较。

例如

Drawable btnBackground = holder.btnGenre.getBackground();
if(btnBackground.getConstantState() == (getResources().getDrawable(R.drawable.frame_genre).getConstantState())){
                   Toast.makeText(context, "WORKED", Toast.LENGTH_SHORT).show();
               }

那么这个 if 语句检查按钮的背景。如果它 frame_genre 那么它应该继续到块。

在我的例子中,背景按钮是 frame_genre 并且 if 语句应该是 TRUE。 但出于某种原因,当我记录按钮背景 Log.d(TAG, btnBackground.getConstantState().toString());frame_genre Log.d(TAG,getResources().getDrawable(R.drawable.frame_genre).getConstantState())

它打印两个不同的内存位置。

我不明白为什么,毕竟我指向的是同一个文件 frame_genre。 谁能给我解释一下有什么不同?

我正在寻找一种检查按钮的方法,因为我想在单击按钮后更改其背景。

您需要在 drawable 中创建选择器,这是一个 xml 文件。为按下、正常或选中等状态提供不同的图像可绘制

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btnGenre_selected" android:state_selected="true"></item>
<item android:drawable="@drawable/btnGenre_pressed" android:state_pressed="true"></item>
<item android:drawable="@drawable/btnGenre_normal"></item>

</selector>

将此 xml 作为按钮的背景。

        <Button
    android:id="@+id/btnGenre"
    android:layout_width="110dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="16dp"
    android:layout_marginEnd="16dp"
    android:background="@drawable/selector_xml_name"
    android:text="POST"
    android:padding="16dp"
    android:focusable="true"
    android:clickable="true"/>

在您的 btnGenre 的 clickListner 上以编程方式编写以下代码,

if (Objects.equals(btnGenre.getBackground().getConstantState(), this.getResources().getDrawable(R.drawable.btnGenre_selected).getConstantState()))
{
   star.setBackground(R.drawable.btnGenre_normal);
}else {
  star.setBackground(R.drawable.btnGenre_selected);
}