无法两次更改CheckBox视图的背景颜色 - Android

时间:2013-02-11 19:07:42

标签: android user-interface view background

我尝试在用户将其状态更改为已检查后更改 CheckBox 后台。下面的代码不能很好地工作。如果我单击未选中复选框,其状态和颜色将更改为蓝色,当我再次单击它并取消选中时,颜色将保持蓝色而不是变为红色。我确实引入了 invalidate()的调用而没有成功。我确认该方法会重新获得点击次数并正确查看已检查状态,但如果声明我做过的话似乎只能使用一次。

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;
        ...
    }
    ...
}

我应该如何更改代码以使其按照我的意愿运行?

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

2 个答案:

答案 0 :(得分:2)

要在选中时进行更改,您需要附加OnCheckedChangeListener。将上面的代码置于其中。

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);
        }
    }
 });

答案 1 :(得分:0)

首先解释一个不明确的方面

事情是,如果有人认为我使用了android Color 类,我的代码中提到的示例颜色可能会产生误导。虽然我使用的是 color.xml 中存储的红色蓝色颜色版本,这就是为什么我在代码中将它们声明为 < em> 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(...)的情况下调用资源的颜色。希望这个答案可以帮助像我一样奇怪的人。