Я делаю приложение-викторину и использую ArrayList с. У меня проблема с ответами: он работает, когда у меня есть только один ответ, но что я могу сделать, если на вопрос есть два ответа?
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.util.ArrayList;
import cn.pedant.SweetAlert.SweetAlertDialog;
public class MainActivity extends AppCompatActivity {
TextView questionLabel, questionCountLabel, scoreLabel;
EditText answerEdt;
Button submitButton;
ProgressBar progressBar;
ArrayList<QuestionModel> questionModelArraylist;
int currentPosition = 0;
int numberOfCorrectAnswer = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
questionCountLabel = findViewById(R.id.noQuestion);
questionLabel = findViewById(R.id.question);
scoreLabel = findViewById(R.id.score);
answerEdt = findViewById(R.id.answer);
submitButton = findViewById(R.id.submit);
progressBar = findViewById(R.id.progress);
questionModelArraylist = new ArrayList<>();
setUpQuestion();
setData();
submitButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAnswer();
}
});
answerEdt.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
// If the event is a key-down event on the "enter" button
Log.e("event.getAction()",event.getAction()+"");
Log.e("event.keyCode()",keyCode+"");
if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
(keyCode == KeyEvent.KEYCODE_ENTER)) {
checkAnswer();
return true;
}
return false;
}
});
}
public void checkAnswer(){
String answerString = answerEdt.getText().toString().trim();
if (answerString.equalsIgnoreCase(questionModelArraylist.get(currentPosition).getAnswer())){
numberOfCorrectAnswer ++;
new SweetAlertDialog(MainActivity.this, SweetAlertDialog.SUCCESS_TYPE)
.setTitleText("Sehr gut!")
.setContentText("Richtig!")
.setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
@Override
public void onClick(SweetAlertDialog sweetAlertDialog) {
currentPosition ++;
setData();
answerEdt.setText("");
sweetAlertDialog.dismiss();
}
})
.show();
}else {
new SweetAlertDialog(MainActivity.this, SweetAlertDialog.ERROR_TYPE)
.setTitleText("Falsch :(")
.setContentText("Die Richtige Antwort ist : "+questionModelArraylist.get(currentPosition).getAnswer())
.setConfirmText("OK")
.setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
@Override
public void onClick(SweetAlertDialog sDialog) {
sDialog.dismiss();
currentPosition ++;
setData();
answerEdt.setText("");
}
})
.show();
}
int x = ((currentPosition+1) * 100) / questionModelArraylist.size();
progressBar.setProgress(x);
}
public void setUpQuestion(){
questionModelArraylist.add(new QuestionModel("Write one planet located between Earth and the sun","Venus or Mercury"));
questionModelArraylist.add(new QuestionModel("the 5th planet from the sun","Jupiter"));
questionModelArraylist.add(new QuestionModel("write names of any two oceans","Atlantic Ocean or Arctic Ocean or Indian Ocean or Pacific Ocean orSouthern Ocean"));
}
public void setData(){
if (questionModelArraylist.size()>currentPosition) {
questionLabel.setText(questionModelArraylist.get(currentPosition).getQuestionString());
scoreLabel.setText("Ergebnis :" + numberOfCorrectAnswer + "/" + questionModelArraylist.size());
questionCountLabel.setText("Frage Nummer : " + (currentPosition + 1));
}else{
new SweetAlertDialog(MainActivity.this, SweetAlertDialog.SUCCESS_TYPE)
.setTitleText("Du bist Fertig :)")
.setContentText("dein Ergebnis ist : "+ numberOfCorrectAnswer + "/" + questionModelArraylist.size())
.setConfirmText("Wiederholen")
.setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
@Override
public void onClick(SweetAlertDialog sDialog) {
sDialog.dismissWithAnimation();
currentPosition = 0;
numberOfCorrectAnswer = 0;
progressBar.setProgress(0);
setData();
}
})
.setCancelText("schließen")
.setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() {
@Override
public void onClick(SweetAlertDialog sDialog) {
sDialog.dismissWithAnimation();
finish();
}
})
.show();
}
}
}
Вопрос Класс
public class QuestionModel {
public QuestionModel(String questionString, String answer) {
QuestionString = questionString;
Answer = answer;
}
public String getQuestionString() {
return QuestionString;
}
public void setQuestionString(String questionString) {
QuestionString = questionString;
}
public String getAnswer() {
return Answer;
}
public void setAnswer(String answer) {
Answer = answer;
}
private String QuestionString;
private String Answer;
}
Как видите, я хочу, чтобы ответ в первом вопросе был Меркурий или Венера, второй вопрос - Юпитер, а третий вопрос имеет 5 ответов: «Атлантический океан или Северный Ледовитый океан, Индийский океан, Тихий океан или Южный океан». как заставить его работать? Спасибо.
Я не могу ответить одновременно на два ответа. поэтому мне нужно что-то сделать, чтобы он принял все ответы, и пользователь мог написать один из них и перейти к следующему вопросу




В основном: изменяя вашу модель данных.
Видите ли, вы создаете свои классы, чтобы «моделировать» реальность. Если вы хотите разрешить несколько ответов, тогда простое сопоставление один-к-одному (как подразумевает QuestionModel) просто не работает. Тогда ваша модель должна быть 1: n, как 1 строка вопроса, но ответом может быть, например, List<String>. Для вопросов, на которые есть только один ответ, этот список просто содержит только одну запись.
Это путь туда: первый вы придумываете, как ваши данные должны быть организованы, затем вы строите все вокруг, включая структуры пользовательского интерфейса.
@GhostCat верен, вы должны проанализировать его перед реализацией. Для вашей конкретной ситуации я думаю, что перечисления могут быть полезны. Я не совсем понимаю вашу цель, но поначалу я бы подошел к ней именно так.
И чтобы обобщить это в вашем классе QuestionModel, я бы сначала создал интерфейс, чтобы описать любой возможный ответ.
interface AnswerInterface {
val value: String
}
Я бы использовал дженерики, расширяющие этот интерфейс, и тогда моя QuestionModel стала бы такой.
class QuestionModel<QuestionAnswer : AnswerInterface>(
var question: String,
vararg answers: QuestionAnswer
)
QuestionAnswer может быть любым классом, который реализует AnswerInterface, а varard означает, что я могу иметь любое количество ответов в качестве ответов.
Имея это в виду, мои ответы будут следующими:
enum class PlanetAnswers(override val value: String) : AnswerInterface {
VENUS("Venus"),
MERCURY("Mercury"),
JUPITER("Jupiter")
}
Наконец, все взаимосвязано так:
val question1 = QuestionModel("One planet between Earth and Sun?", PlanetAnswers.VENUS, PlanetAnswers.MERCURY)
val question2 = QuestionModel("The 5th planet from the Sun?", PlanetAnswers.JUPITER)
У меня есть вопрос и множество ответов, но все они должны происходить из одного и того же перечисления. Я могу создать больше перечислений, а затем создать больше вопросов с другим набором ответов.
Я новичок в enum и не знаю, как его использовать. поэтому я пытался выучить его и заставить его работать у меня около 6 часов, но этого не произошло. Если вы предоставите мне окончательно отредактированный код, я буду вам благодарен. устал без надежды пытаться :(
@ j.ibra10 нормально, но я дам вам код Kotlin, потому что, если вы новичок, зачем вам делать что-то еще? XD
Что именно вам мешает заставить его работать?