Android: 如何在单击时将 onClickListener 设置为不同的按钮

Android: How to set onClickListener to different button when clicked

我有十个按钮,其中只有一个在任何时候都有红色背景,红色按钮有一个 onClicklistener。 当点击这个红色按钮时,这十个随机按钮之一将变成红色背景,这个新的红色按钮应该使用之前的 onCLickListener,当再次点击这个新的红色按钮时,这十个随机按钮之一会变成红色背景,onClickListener 应该分配给它,每次单击 RedButton 时都有一个计数器计数。

示例: 有四个按钮 [WhiteButton WhiteButton RedButton WhiteButton] 只有RedButton有onClickListener 单击 RedButton 时,其中一个按钮颜色变为红色 [白色按钮红色按钮白色按钮白色按钮] 单击此新的 RedButton 时,按钮变为 [WhiteButton WhiteButton WhiteButton RedButton]

第一次单击 RedButton 时,我可以将十个按钮之一的颜色更改为红色,但无法将 OnClickListener 设置为新的 RedButton。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ourButton = (Button) findViewById(R.id.button);
    ourTextView = (TextView) findViewById(R.id.textView);

    buttons[0] = (Button) findViewById(R.id.button2);
    buttons[1] = (Button) findViewById(R.id.button3);
    buttons[2] = (Button) findViewById(R.id.button4);
    buttons[3] = (Button) findViewById(R.id.button5);

    Random r = new Random();
    oddValue = r.nextInt(4 - 0);
    buttons[oddValue].setBackgroundColor(Color.RED);

    buttons[oddValue].setOnClickListener(new ourOnClickListener(this));

我们的OnClickListener

public class ourOnClickListener implements OnClickListener{
    MainActivity caller;
    private int count;


    public ourOnClickListener(MainActivity activity) {
        this.caller = activity;
        this.count = 0;

    }

    public void onClick(View view) {
        int i;
        count = count + 1;
        Random r = new Random();

        int oddValue_new = r.nextInt(4 - 0);

        caller.buttons[oddValue_new].setBackgroundColor(Color.RED);
        caller.ourTextView.setText("Count : " + count);

    }

}

您可以像设置背景颜色一样进行操作:

caller.buttons[oddValue_new].setOnClickListener(this);

由于您是 onClickListener,因此您可以将其称为新的 onClickListener。

  • 如果只想要红色按钮可以点击。您可以将 Enabled 全部设置为 false(不包括红色按钮)。因此,您将为所有按钮设置 OnClickListener。

  • 如果所有的按钮都可以点击,只有点击红色时才会有运行动作。您应该检查单击的按钮并比较它是否是事件 Click

  • 中的红色按钮
  • 从所有按钮中移除 OnClickListener 'setOnClickListener(null)',并将 SetOnClickListener 设置为红色

我会以不同的方式解决这个问题。

  1. 保存对红色背景按钮的引用 redButton

  2. 所有按钮都相同onClick。在 onClick 中,只需验证单击的按钮是否为红色背景(只需通过参考检查)。如果没有 - 什么都不做。如果是:select 新按钮,更改背景并保存对新按钮的引用。

您的 onClick 方法应如下所示:

public void onClick(View view) {
    if (view == redButton) {
        redButton.setBackgroundColor(Color.WHITE);
        Random r = new Random();
        int oddValue_new = r.nextInt(4 - 0);
        redButton = buttons[oddValue_new];
        redButton.setBackgroundColor(Color.RED);
    } 
}

更新

正如@Mr Phuc 87 所建议的那样,您可以使用 enabled。我认为这是非常好的方法。除了 enabled,您还可以使用 state-list。创建 android:state_enabled=false 白色背景和 android:state_enabled=true 红色背景的状态列表。现在您只需更改 enabled 属性 个按钮即可。

OnClick 应该看起来像:

public void onClick(View view) {
    redButton.setEnabled(false);
    Random r = new Random();
    int oddValue_new = r.nextInt(4 - 0);
    redButton = buttons[oddValue_new];
    redButton.setEnabled(true);

}

state-list 应该是这样的(放在 drawable 中):

<selector xmlns:android="http://schemas.android.com/apk/res/android"
    <item android:state_selected="false" android:drawable=@color/white />
    <item android:state_selected="true" android:drawable=red_here />
</selector>