【问题标题】:Android: checking a view's backgroundAndroid:检查视图的背景
【发布时间】:2016-04-30 21:14:25
【问题描述】:

我有 3 个按钮,默认情况下它们都具有相同的可绘制背景 (subject_button)

我想做的事:

当我单击一个按钮时,他的背景会更改(变为clicked_subject),所有其他按钮都保持默认背景,如果我在单击另一个按钮后单击一个按钮,我刚刚单击的按钮会更改他的背景,而前一个按钮会返回到初始背景,只允许一个按钮具有clicked_subject 背景,如果再次单击不同的按钮,他的背景会回到初始背景,让所有按钮具有初始背景。

问题:

如果我点击不同的按钮,他的背景保持不变,而不是变回原来的背景。

我的逻辑:

theButton1.setBackgroundResource(R.drawable.subject_button);
theButton1.setOnClickListener(this);
//same for other 2

@Override
public void onClick(View v) {
    if (v.getBackground() == ContextCompat.getDrawable(this, R.drawable.subject_button)) {

        theButton1.setBackgroundResource(R.drawable.subject_button);
        theButton2.setBackgroundResource(R.drawable.subject_button);
        theButton3.setBackgroundResource(R.drawable.subject_button);

        v.setBackgroundResource(R.drawable.clicked_subject);

    } else {

        v.setBackgroundResource(R.drawable.subject_button);
    }

为什么会这样?

【问题讨论】:

    标签: java android logic


    【解决方案1】:

    你可以这样做:

    private final List<Button> mButtons = new ArrayList<>();
    
    // somewhere in your code
    mButtons.add(mButton1);
    mButtons.add(mButton2);
    mButtons.add(mButton3);
    mButton1.setOnClickListener(mClickListener);
    mButton2.setOnClickListener(mClickListener);
    mButton3.setOnClickListener(mClickListener);
    
    private final View.OnClickListener mClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            for (Button button : mButtons) {
                if (button == v) {
                    // set selected background
                } else {
                    // set not selected backround
                }
            }
        }
    };
    

    如果您为按钮定义了一个有状态的可绘制对象,那么您可以简单地将 onclick 更改为:

    private final View.OnClickListener mClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            for (Button button : mButtons) {
                button.setSelected(v == button);
            }
        }
    };
    

    【讨论】:

    • 仍然存在同样的问题,即单击选定按钮后,背景应该回到初始可绘制对象
    【解决方案2】:

    要根据特定事件(焦点、按下、正常)更改背景颜色/图像,您需要定义一个按钮选择器文件并将其实现为按钮的背景。例如 button_selector.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/your_image1" /> <!-- pressed -->
         <item android:state_focused="true"
               android:drawable="@drawable/your_image2" /> <!-- focused -->
        android:drawable="@drawable/your_image3" <!-- default -->
     </selector>
    

    然后将其应用为:

     <Button
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:drawable="@drawable/button_selector.xml" />
    

    【讨论】:

      【解决方案3】:

      我解决了这个问题,而不是在单击按钮时仅更改背景颜色,我还更改了 textColor,然后我可以使用 if (((Button) v).getCurrentTextColor() == Color.WHITE) 检查 textColor

      【讨论】:

        【解决方案4】:

        “Pressed”、“selected”、“disabled”等是View 状态。因此,它们应该由 Android 自动处理,而不是由您的点击侦听器处理。

        这是使用SateLists 实现的,它根据视图所处的状态控制视图的外观。因此您可以轻松地将subject_button 设置为未按下状态,将clicked_subject 设置为按下状态,并让 Android 处理它们之间的实际切换。

        完整解释:https://developer.android.com/guide/topics/resources/drawable-resource.html#StateList

        【讨论】:

        • 使用ListState点击另一张图片时,如何更改图片的背景?
        • 理想情况下您不需要这样做,因为 Android 应该会处理它(如果您从视图中抬起手指,它的状态会自动更改)。如果您的视图状态为已连接,请考虑使用单选按钮:developer.android.com/intl/zh-cn/guide/topics/ui/controls/…
        猜你喜欢
        • 2015-07-04
        • 2014-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-26
        • 1970-01-01
        相关资源
        最近更新 更多