【问题标题】:Can't change background color of CheckBox view twice - Android无法两次更改 CheckBox 视图的背景颜色 - Android
【发布时间】:2013-03-14 20:16:21
【问题描述】:

在用户将其状态更改为 Checked 后,我尝试更改 CheckBox 背景。下面的代码不能很好地工作。如果我单击未选中的复选框,它将状态和颜色更改为蓝色,当我再次单击它并取消选中时,颜色保持蓝色而不是变为红色。我确实引入了 invalidate() 的调用,但没有成功。我确认该方法收到点击并正确查看检查状态,但我所做的 if 语句 似乎只工作一次。

XML

<CheckBox
    android:id="@+id/chkLargeIcons"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="20"
    android:onClick="handleCheckBoxClick" />

代码

public void handleCheckBoxClick(View view) {
    CheckBox tmpChkBox = (CheckBox) findViewById(view.getId());
    if(tmpChkBox.isChecked())
    {
        tmpChkBox.setBackgroundColor(color.blue);
    }
    else
    {
        tmpChkBox.setBackgroundColor(color.red);
    }

    System.out.println(view.getId() + " " + tmpChkBox.isChecked());

    switch (view.getId()) {
    case R.id.chkLargeIcons:
        ...     
    break;
        ...
    }
    ...
}

我应该对我的代码进行哪些更改以使其按我的意愿工作?

提前感谢您的任何帮助和建议。

【问题讨论】:

  • 你把这段代码放在哪里了?
  • @JustinJasmann 我有多个复选框,我为其指定了相同的“OnClick”方法,此代码在此方法中,并且作为 System.out.println 输出应有的内容,复选框的可视状态单击一两次后保持不变
  • 您能否发布更多代码以显示您在此侦听器中的关联位置?
  • @JustinJasmann 完成,虽然我不知道它是如何相关的,而 system.out.println 正确打印与复选框的所有交互
  • 我只是想自己重现它。 if/else 对我来说很好用。你在你的开关/机箱里做什么?

标签: android user-interface view background


【解决方案1】:

要在检查时更改它,您需要附加一个 OnCheckChangedListener。然后把上面的代码放在里面。

CheckBox tmpChkBox = (CheckBox) findViewById(view.getId());
tmpChkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            buttonView.setBackgroundColor(Color.BLUE);
        } else { 
            buttonView.setBackgroundColor(Color.RED);
        }
    }
 });

【讨论】:

  • 在我的情况下它不起作用,不同的是,它在选中和取消选中后将颜色变为蓝色,并停止工作。其他问题 - 为一个对象设置多次相同的侦听器是否是一种好习惯,我的方法的代码处理多个复选框并通过 id 区分它们。
【解决方案2】:

首先解释一个不清楚的方面

如果有人假设我使用 android Color 类,我的代码中提到的示例颜色可能会产生误导。当我使用存储在 color.xml 中的颜色版本 redblue 时,这就是为什么我在代码中将它们声明为 color.red 而不是 Color.RED

所以我的代码与其他答案中的侦听器代码相同,如果您假设颜色取自 android 类,则两者都是有效的。

我的问题的根源是一些奇怪的故障,或者我不知道导致以下代码工作错误的 android 行为。

public void handleCheckBoxClick(View view) {
    CheckBox tmpChkBox = (CheckBox) findViewById(view.getId());
    if(tmpChkBox.isChecked())
    {
        tmpChkBox.setBackgroundColor(color.blue);
    }
    else
    {
        tmpChkBox.setBackgroundColor(color.red);
    }
}

正是这样的线条

    tmpChkBox.setBackgroundColor([ColorFromResources]);

虽然代码的执行只让我发生了一次颜色变化,但它就这样保持不变,完全没有响应。这一变化在很大程度上具有误导性,让我在这个问题上停留了很长时间,甚至让我把它留待以后修复。 经过更多研究后,我发现以下代码更改可以解决我的问题:

   tmpChkBox.setBackgroundColor(getResources().getColor([ColorFromResources]));

现在一切都像一个魅力。但我仍然很困惑,为什么没有 getResources().getColor(...) 的情况下从资源中调用颜色。希望这个答案能帮助像我这样奇怪的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2018-06-11
    • 1970-01-01
    相关资源
    最近更新 更多