본문 바로가기

안드로이드 스튜디오

[안드로이드 스튜디오]퀴즈앱 로직개발(AlertDialog 활용)

먼저 model 디렉토리와 quiz 디렉토리를 만들어 준다.

model 디렉토리의 Quiz 클래스 코드

package com.kks.model;

public class Quiz {

    private int question;
    private boolean answer;


    public Quiz(int question, boolean answer) {
        this.question = question;
        this.answer = answer;
    }


    public int getQuestion() {
        return question;
    }

    public void setQuestion(int question) {
        this.question = question;
    }

    public boolean isAnswer() {
        return answer;
    }

    public void setAnswer(boolean answer) {
        this.answer = answer;
    }
}
  • 필드: question과 answer라는 두 개의 프라이빗 필드를 가지고 있다.
  • 생성자: 객체 생성 시 question과 answer 값을 초기화한다.
  • Getter와 Setter 메서드: 각 필드의 값을 가져오거나 설정하는 메서드를 제공한다.

이 클래스는 퀴즈 애플리케이션에서 각 퀴즈 항목을 나타내는 데 사용될 수 있다. 예를 들어, question 필드는 질문의 ID를, answer 필드는 그 질문의 정답 여부를 저장하는 데 사용된다.

 

안드로이드 퀴즈 앱 로직 설명

사용자가 퀴즈를 풀 수 있는 안드로이드 앱의 주요 로직을 설명한다. 이 앱은 퀴즈 문제를 출제하고, 사용자가 정답과 오답을 선택하면 결과를 보여준다. 모든 퀴즈가 끝나면 결과를 요약한 알림 창이 표시된다.

 

package com.kks.quiz;

import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import com.kks.model.Quiz;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    int count = 0; // 정답 횟수를 저장하는 변수이다.

    TextView txtQuiz; // 현재 퀴즈를 보여주는 TextView이다.
    ProgressBar progressBar; // 진행 상황을 나타내는 ProgressBar이다.
    TextView txtResult; // 정답 여부를 보여주는 TextView이다.
    Button btnTrue; // "True" 버튼이다.
    Button btnFalse; // "False" 버튼이다.

    // 퀴즈 문제들을 저장할 ArrayList이다.
    ArrayList<Quiz> quizArrayList = new ArrayList<>();
    private int currentQuizIndex; // 현재 퀴즈의 인덱스를 저장하는 변수이다.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        // XML 레이아웃 파일의 UI 컴포넌트를 자바 변수와 연결한다.
        txtQuiz = findViewById(R.id.txtQuiz);
        progressBar = findViewById(R.id.progressBar);
        txtResult = findViewById(R.id.txtResult);
        btnTrue = findViewById(R.id.btnTrue);
        btnFalse = findViewById(R.id.btnFalse);

        // 퀴즈를 설정한다.
        setQuiz();

        // 첫 번째 퀴즈를 화면에 출제한다.
        Quiz quiz = quizArrayList.get(currentQuizIndex);
        txtQuiz.setText(quiz.getQuestion());

        // 프로그래스바에 진행 상황을 표시한다.
        progressBar.setProgress(currentQuizIndex + 1);

        btnTrue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Quiz quiz = quizArrayList.get(currentQuizIndex);
                if (quiz.isAnswer() == true) {
                    txtResult.setText("정답입니다~~");
                    count += 1;
                } else {
                    txtResult.setText("오답입니다~~");
                }
                currentQuizIndex += 1;
                if (currentQuizIndex == quizArrayList.size()) {
                    showAlertDialog();
                    return;
                }
                quiz = quizArrayList.get(currentQuizIndex);
                txtQuiz.setText(quiz.getQuestion());
                progressBar.setProgress(currentQuizIndex + 1);
            }
        });

        btnFalse.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Quiz quiz = quizArrayList.get(currentQuizIndex);
                if (quiz.isAnswer() == false) {
                    txtResult.setText("정답입니다~~");
                    count += 1;
                } else {
                    txtResult.setText("오답입니다~~");
                }
                currentQuizIndex += 1;
                if (currentQuizIndex == quizArrayList.size()) {
                    showAlertDialog();
                    return;
                }
                quiz = quizArrayList.get(currentQuizIndex);
                txtQuiz.setText(quiz.getQuestion());
                progressBar.setProgress(currentQuizIndex + 1);
            }
        });
    }

    private void showAlertDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setCancelable(false);
        builder.setTitle("퀴즈 끝!");
        builder.setMessage("지금까지 맞춘 문제는 " + count + "개 입니다. 다시풀기를 누르시면 퀴즈가 재시작 되고, 종료를 누르시면 퀴즈가 종료됩니다.");
        builder.setPositiveButton("다시풀기", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                currentQuizIndex = 0;
                count = 0;
                Quiz quiz = quizArrayList.get(currentQuizIndex);
                txtQuiz.setText(quiz.getQuestion());
                progressBar.setProgress(currentQuizIndex + 1);
                txtResult.setText("결과");
            }
        });
        builder.setNegativeButton("종료", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });
        builder.show();
    }

    private void setQuiz() {
        Quiz q = new Quiz(R.string.q1, true);
        quizArrayList.add(q);
        q = new Quiz(R.string.q2, false);
        quizArrayList.add(q);
        q = new Quiz(R.string.q3, true);
        quizArrayList.add(q);
        q = new Quiz(R.string.q4, false);
        quizArrayList.add(q);
        q = new Quiz(R.string.q5, false);
        quizArrayList.add(q);
        q = new Quiz(R.string.q6, true);
        quizArrayList.add(q);
        q = new Quiz(R.string.q7, true);
        quizArrayList.add(q);
        q = new Quiz(R.string.q8, true);
        quizArrayList.add(q);
        q = new Quiz(R.string.q9, false);
        quizArrayList.add(q);
        q = new Quiz(R.string.q10, true);
        quizArrayList.add(q);
    }
}

필드 선언

  • count는 정답 횟수를 저장하는 변수이다.
  • txtQuiz는 현재 퀴즈를 보여주는 TextView이다.
  • progressBar는 진행 상황을 나타내는 ProgressBar이다.
  • txtResult는 정답 여부를 보여주는 TextView이다.
  • btnTrue는 "True" 버튼이다.
  • btnFalse는 "False" 버튼이다.
  • quizArrayList는 퀴즈 문제들을 저장할 ArrayList이다.
  • currentQuizIndex는 현재 퀴즈의 인덱스를 저장하는 변수이다.

onCreate 메서드

  • 액티비티가 생성될 때 호출되는 메서드이다. 여기서 UI 컴포넌트를 자바 변수와 연결하고, 퀴즈를 설정한 후 첫 번째 퀴즈를 화면에 출제한다.
  • btnTrue와 btnFalse 버튼에 클릭 리스너를 설정하여 사용자가 정답과 오답을 선택할 때 각각의 동작을 정의한다.

 

showAlertDialog 메서드

  • 퀴즈가 모두 끝났을 때 결과를 요약한 알림 창을 표시하는 메서드이다. "다시풀기" 버튼을 클릭하면 퀴즈를 초기화하고, "종료" 버튼을 클릭하면 액티비티를 종료한다.

setQuiz 메서드

  • 퀴즈 문제들을 설정하는 메서드이다. Quiz 객체를 생성하여 quizArrayList에 추가한다.

 

이 앱은 사용자가 퀴즈를 풀 수 있도록 도와주는 간단한 안드로이드 애플리케이션이다. 각 퀴즈 문제는 Quiz 객체로 저장되며, 사용자가 "True" 또는 "False" 버튼을 클릭하면 정답 여부를 확인하고 결과를 표시한다. 모든 퀴즈가 끝나면 사용자가 다시 퀴즈를 풀거나 종료할 수 있도록 알림 창이 표시된다.

 

안드로이드 퀴즈 실행결

먼저 문제를 풀면 프로그래스 바 게이지가 차는 것을 볼 수 있다.

퀴즈를 다풀면 종료 및 다시풀기 버튼이 나오는데, 다시풀기를 누르면 처음부터 다시 풀 수 있게 되고,

종료를 누를시 화면이 내려간다.