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);
}
我正在尝试比较按钮背景和资源文件。 例如,我有按钮
按钮
<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);
}