【问题标题】:Android: set multiple button selection onClickAndroid:设置多个按钮选择onClick
【发布时间】:2023-03-12 19:00:01
【问题描述】:

我有一组按钮:

[Button1]
[Button2]
[Button3]
[Button4]
[Button5]
[Button6]

所有这些都共享相同的onClick方法:

b.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        Button b = (Button) v;
        Button comp;
        int i = b.getId();
        selected[i] = !selected[i];
        b.setSelected(selected[i]);
        for (int j = 0; j < 6; j++) {
            if (i != j) {
                selected[j] = false;
                comp = lifestyleButtonArray.get(j);

                if(comp.isSelected())
                    comp.setSelected(selected[j]);
                    Log.w(TAG,"[Button] selection for button #"+j+"="+selected[j]);

            }
        }
    }
});

onClick 方法的第一部分按预期工作。单击按钮时,切换按钮的“选择”值以更改按钮的颜色(在可绘制的 xml 文件中定义),然后取消选择所有其他按钮,以便最多有一个按钮被标记为“已选择”时间。

选择部分有效,但是按钮没有用适当的颜色重新绘制,所以似乎选择了两个按钮!

我尝试过 invalidate 和 requestLayout,但这没有帮助。有什么建议吗?

编辑:再考虑一下,这里要问的真正问题是:

如何更新不是来自 onClick 方法的视图?

在我的示例中,当我选择按钮 1 时,我希望能够从按钮 2-6 中删除选择,但由于按钮 2-6 不是被调用的视图,因此它们显示正确的选定值(它们未被选中) 但不要将其 UI 视图更新为“未选择”颜色!

【问题讨论】:

  • 你为什么不让你的Activity实现onClickListener,然后为你所有的Button覆盖一个方法onClick(View v),然后你可以使用Switch(v.getId(){ case在它们之间切换R.id.btn1 : //TODO....break; case R.id.btn2 : ....etc
  • 因为这一切都在一个更大的活动中,该活动实现了自己的 onClick 方法来处理另一部分代码。我不需要能够在按钮之间切换,我需要能够设置按钮的选择值并重新绘制。

标签: android button onclick


【解决方案1】:

设置按钮的选中状态后,您可以在每个按钮上调用“invalidate()”函数来强制它们在下一个周期更新。

【讨论】:

  • 试过了,没用,因为它超出了被点击的视图范围,无效调用不会更新 UI。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 2012-05-19
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
相关资源
最近更新 更多