Как обрабатывать нажатие кнопки после другого нажатия кнопки - PullRequest
0 голосов
/ 21 декабря 2018

Я создал несколько кнопок, когда пользователь нажимает первую кнопку, затем граница первой кнопки изменяется на 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;
    }
}

Image 1

Image 2

при запуске этого кода я получил ошибку:

Причина: время отправки ввода истекло (Ожидание, потому что затронутое окно не завершило обработку событий ввода, которые ранее были ему доставлены.) Нагрузка: 1.68 / 1.09 / 0.72

Как решить эту проблему?Большое спасибо за ваше время и помощь в этом вопросе.

Ответы [ 4 ]

0 голосов
/ 22 декабря 2018
  • это - хорошее решение для добавления границы дескриптора.

    • Что касается второй части, сохраните экземпляр вида кнопкив переменной и доступ к ней позже при нажатии другой кнопки.

         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;
      }
      
      }
      
0 голосов
/ 21 декабря 2018

Согласно вашему коду, если последняя кнопка! = 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;

Надеюсь, это работает

0 голосов
/ 21 декабря 2018

просто установите цвет по умолчанию в кнопке Все при каждом нажатии кнопки.затем, после установки цвета границы, нажмите кнопку.как ниже

    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));
        }
    }
0 голосов
/ 21 декабря 2018

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
}

или вы можете выполнить щелчок по идентификатору кнопки

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

}
...