【问题标题】:Android - compare between button background to ResourceAndroid - 比较按钮背景和资源
【发布时间】:2020-04-15 14:36:07
【问题描述】:

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

按钮

        <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_genreif 语句应该是 TRUE。 但是由于某种原因,当我记录按钮背景Log.d(TAG, btnBackground.getConstantState().toString());frame_genre Log.d(TAG,getResources().getDrawable(R.drawable.frame_genre).getConstantState())

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

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

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

【问题讨论】:

  • 为什么不使用选择器来进行点击和非点击状态?
  • 从未听说过。你能指导我去哪里找吗?

标签: android android-layout android-components


【解决方案1】:

您需要在 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);
}

【讨论】:

  • 好吧,有一种方法可以让我以编程方式检查当前按钮是否具有btnGenre_selectedbtnGenre_pressed编辑我应该使用(getResources().getDrawable(R.drawable.frame_genre).getConstantState()对吗?
  • 如果你想以编程方式实现它,那么是的,你需要使用可绘制的 ConstantState。我会更新我的答案
  • 非常感谢,非常感谢
  • 还是不行。 if 语句总是返回 false。它仍然指向不同的内存位置。按钮背景和getResources()
  • 好吧,我不认为它会起作用,因为这个按钮,我在回收站视图中创建。我有 9 个按钮,所以我认为每个按钮都有自己的位置记忆。但这仍然没有任何意义,因为我只有一个 Drawable 文件,并且我将每个 Button 指向该 Drawable 文件。我想我在这里遗漏了一些东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多