Есть ли команда Java, которая означает «если нажата любая кнопка»?

#java #android

#java #Android

Вопрос:

Я пытаюсь поработать над некоторым кодом, который я сделал для приложения для игры в кости, где, если была нажата кнопка броска, отображались бы случайные стороны кости. Я пытаюсь повторно использовать эту концепцию для моего приложения для викторины с несколькими вариантами ответов, где, если нажата любая кнопка, правильная или неправильная, она перейдет к следующему вопросу:

Я думал, что это будет выглядеть примерно так, с «button», представляющим все нажатые кнопки. Однако в этом тесте с множественным выбором будет только 4 кнопки (A, B, C и D), которые я хочу, чтобы это произошло при нажатии. Я уверен, что мог бы добиться этого, повторив абзац кода 4 раза с каждой кнопкой, но мне было интересно, есть ли более простой способ представить все 4 кнопки в одной строке

(Большая часть кода, который я показываю, предназначена для приложения dice, в основном это первое слово первой строки, с которым мне нужна помощь)

 button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Log.d("multic", "the Button has been pressed!");

                Random randomNumberGenerator = new Random();

                int number = randomNumberGenerator.nextInt(8);

                Log.d("Dicee", "the random number is: "   number);

                leftDice.setImageResource(diceArray[number]);

                int number1 = randomNumberGenerator.nextInt(8);

                rightDice.setImageResource(diceArray[number1]);


            }
        });
  

Я ожидаю, что после нажатия одной из кнопок он перейдет к следующему вопросу.

Ответ №1:

Вы можете определить слушателя следующим образом:

 View.OnClickListener listener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d("multic", "the Button has been pressed!");
        Random randomNumberGenerator = new Random();
        int number = randomNumberGenerator.nextInt(8);
        Log.d("Dicee", "the random number is: "   number);
        leftDice.setImageResource(diceArray[number]);
        int number1 = randomNumberGenerator.nextInt(8);
        rightDice.setImageResource(diceArray[number1]);                
    }
};
  

а затем установите в нем столько кнопок, сколько вы хотите:

 button1.setOnClickListener(listener);
button2.setOnClickListener(listener);
button3.setOnClickListener(listener);
button4.setOnClickListener(listener);
  

Ответ №2:

Вы можете использовать один объект listener с инструкцией switch, чтобы проверить, какая кнопка нажата.

 Button b1,b2;
//findViews
View.OnClickListener listener=new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //code
        switch((Button)v){
            case b1:
                //code
                break;
            case b2:
                //code
                break;

        }
        //code
    }
};
b1.setOnClickListener(listener);
b2.setOnClickListener(listener);
  

Ответ №3:

Для теста с множественным выбором, с набором из 4 возможных ответов, я бы посоветовал вам использовать RadioGroup с составляющими RadioButtom объектами, например так:

 <RadioGroup xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <RadioButton android:id="@ id/radio_pirates"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/pirates"
        android:onClick="onRadioButtonClicked"/>
    <RadioButton android:id="@ id/radio_ninjas"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/ninjas"
        android:onClick="onRadioButtonClicked"/>
</RadioGroup>  
  

Обратите внимание, что у каждого из них RadioButton есть onClick атрибут. Вы можете назвать один и тот же метод для всех переключателей, а затем в activity или fragment использовать один метод для всех кнопок с инструкцией switch, например:

 public void onRadioButtonClicked(View view) {
    // Is the button now checked?
    boolean checked = ((RadioButton) view).isChecked();

    // Check which radio button was clicked
    switch(view.getId()) {
        case R.id.radio_pirates:
            if (checked)
                // Pirates are the best
            break;
        case R.id.radio_ninjas:
            if (checked)
                // Ninjas rule
            break;
    }
}
  

Подробнее:https://developer.android.com/guide/topics/ui/controls/radiobutton#java

Комментарии:

1. Большое вам спасибо :), я проверю это.

2. Как вы думаете, имеет ли значение, если я помещу переключатели в макет ограничения?

3. Нет, так не должно быть. Могу ли я получить более подробную информацию?

Ответ №4:

Несколько разных вариантов, как я думаю:

1) Установите android:onClick="onNextQuestion" xml для всех ваших кнопок. затем в вашем Java-коде напишите:

 public void onNextQuestion(View view) {
    // Do something in response to button click
}
  

2) (Лучше, поскольку может работать в большем количестве случаев) Создайте NextQuestionClickListener класс, который будет реализовывать интерфейс View.OnClickListener и метод, onClick выполняющий желаемый код.

 class NextQuestionClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            // Do something in response to button click
        }
}
  

Затем установите прослушиватель для каждой кнопки:

 NextQuestionClickListener nextQuestionClickListener = new NextQuestionClickListener();
Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);
...
button1.setOnClickListener(nextQuestionClickListener);
button2.setOnClickListener(nextQuestionClickListener);
...
  

3) Использование RxJava и RxBindings

 RxView.clicks(button1)
.mergeWith(RxView.clicks(button2))
.mergeWith(RxView.clicks(button3))
.mergeWith(RxView.clicks(button4))
.subscribe(aVoid -> {
    // Do something in response to button click
}, throwable -> Log.e(TAG, "error in handling click of next question", throwable));
  

4) Также я нашел нож для сливочного масла, где вы можете сделать:

 @Onclick({R.id.button1,R.id.button2,R.id.button3,R.id.button4})
void onButtonClick(View aView) {
    // Do something in response to button click
}