【问题标题】:How to handle button click after another button click单击另一个按钮后如何处理按钮单击
【发布时间】:2018-12-21 09:33:25
【问题描述】:

我创建了几个按钮,当用户点击第一个按钮时,第一个按钮的边框变为red,然后只有用户可以点击第二个按钮。

该程序可以记录用户按下的第二个按钮并显示 到控制台。

稍后,我想将第一个按钮的背景更改为第二个按钮的背景。

    box = new ResizeButton[]{
                    (ResizeButton) findViewById(R.id.kotak1),
                    (ResizeButton) findViewById(R.id.kotak2),
                    (ResizeButton) findViewById(R.id.kotak3),
                    (ResizeButton) findViewById(R.id.kotak4),
                    (ResizeButton) findViewById(R.id.kotak5),
                    (ResizeButton) findViewById(R.id.kotak6),
                    (ResizeButton) findViewById(R.id.kotak7),
                    (ResizeButton) findViewById(R.id.kotak8),
                    (ResizeButton) findViewById(R.id.kotak9)
            };

            boxPlay = new int[]{0,0,0,0,0,0,0,0,0};  // This is to identify player 1 or player 2 win


    box[i].setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
            box[currentButton].setImageDrawable(getResources().getDrawable(R.drawable.border_red));
            int changeWith;
            do {
                changeWith = selectedButton();
            }while (changeWith == -1);
            Log.d("TAG", "Change: " + changeWith);
    }

    private int selectedButton() {
            returnCode = -1;
            for(int i = 0; i < box.length;i++){
                final int selected = i;
                box[i].setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(boxPlay[selected] == 0)
                            returnCode = selected;
                        else
                            invalidSelect();
                    }
                });
            }
            return returnCode;
    }
}

当我运行此代码时出现错误:

原因:输入调度超时(Waiting because the touched 窗口尚未完成对输入事件的处理 之前交付给它。) 负载:1.68 / 1.09 / 0.72

如何解决这个问题?非常感谢您在此问题上的时间和帮助。

【问题讨论】:

  • 可以添加截图吗?无法弄清楚你想说什么this selected button is turn with border red, then user can select another button.??? 这根本没有意义。还有,boxPlay[selected] == 0boxPlay 是什么?我的理解是press first button than only second button should be active and you want to long what is the second button
  • 感谢您的评论先生,请稍等。
  • 检查我的问题新问题先生。
  • 如果用户想要选择的是已经选择的按钮怎么办?
  • 它调用了 invalidSelect 函数。

标签: android button onclicklistener


【解决方案1】:

只需在每次单击按钮时在所有按钮中设置默认颜色。 然后在可点击按钮中设置边框颜色后。如下所示

    box[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    setDefualtColor()
                    box[currentButton].setImageDrawable(getResources().getDrawable(R.drawable.border_red));
                    int changeWith;
                    do {
                        changeWith = selectedButton();
                    }while (changeWith == -1);
                    Log.d("TAG", "Change: " + changeWith);
                }


private void setDefualtColor(){
        for(int i = 0; i < box.length;i++){
            box[i].setBackground(ContextCompat.getDrawable(baseActivity, R.drawable.defualt_color));
        }
    }

【讨论】:

  • 感谢您的回复先生,边框已经工作,但是当用户选择第二个按钮时出现错误。
  • 我认为您应该使用单独的按钮而不是数组。这很容易和简单。
【解决方案2】:

根据您的代码,如果最后一个按钮!=0,它将返回invalidSelect(),因此返回boxPlay[selected] == 0 时的值。

private int selectedButton() {
        returnCode = -1;
        for(int i = 0; i < box.length;i++){
            final int selected = i;
            box[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(boxPlay[selected] == 0)
                        return selected;
                    else
                       invalidSelect();
            }
        });
    }
    return returnCode;

希望这可行

【讨论】:

  • 您好,感谢您的回答,但我的 invalidSelect 是一个无效函数。
  • 另外,我无法从那里返回值。它只向用户显示 Toast 消息。
【解决方案3】:
  • this是添加手柄边框的好方法。

    • 至于第二部分,将按钮视图的实例保存在一个变量中,然后在单击其他按钮时访问它。

         private int[] boxPlay = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0};  // This is to identify player 1 or player 2 win
      
         private Button lastSelectedbutton = null //to store the current selected button instance to get the drawable and reset the button
      
      
         box[i].setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick (View v){
          //this v is the current selected button view's instance
      
      
          // check here if button this is the second button or first
          if (lastSelectedbutton != null) {
      
      
              //means this is second button
              setUpSecondButton(v, lastSelectedButton);
      
              lastSelectedButton = null;
      
          } else {
      
              box[currentButton].setImageDrawable(getResources()
                      .getDrawable(R.drawable.border_red));
              lastSelectedButton = (Button) v;
              int changeWith;
              do {
                  changeWith = selectedButton();
              } while (changeWith == -1);
              Log.d("TAG", "Change: " + changeWith);
      
          }
      
      }
      private void setUpSecondButton (Button secondButton, Button firstButton){
          //copy the drawable to second button and reset first button as per need.
          secondButton.setBackground(firstButton.getBackground())
          firstButton.setBackground(null)
      }
      private int selectedButton () {
          returnCode = -1;
          for (int i = 0; i < box.length; i++) {
              final int selected = i;
              box[i].setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      if (boxPlay[selected] == 0)
                          returnCode = selected;
                      else
                          invalidSelect();
                  }
              });
          }
          return returnCode;
      }
      
      }
      

【讨论】:

    【解决方案4】:

    XML:

    <Button
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:onClick="btn1"/>
    <Button
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:onClick="btn2"/>
    

    Java:

    public void btn1(View v){
       //perform any task on btn1 click
       btn2(v);//btn2 click on 1st button click
    }
    
    public void btn2(View v){
       //perform any task on btn2 click
    }
    

    或者您可以通过按钮 id 执行点击

    box[i].setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
            box[currentButton].setImageDrawable(getResources().getDrawable(R.drawable.border_red));
            int changeWith;
            do {
                changeWith = selectedButton();
            }while (changeWith == -1);
            Log.d("TAG", "Change: " + changeWith);
            box[i+1].performClick();
            box[6].performClick();//or
    
    }
    

    【讨论】:

    • 您好,谢谢您的回答先生,请检查我的新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多