#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
}