【发布时间】: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 方法来处理另一部分代码。我不需要能够在按钮之间切换,我需要能够设置按钮的选择值并重新绘制。