개발학습일지

[Android Studio] Quiz 엑티비티 만들기 _AlertDialog.Builder 본문

Android Studio

[Android Studio] Quiz 엑티비티 만들기 _AlertDialog.Builder

처카푸 2024. 6. 5. 16:22

Quiz APP 만들기

 

1. activity_main.xml 화면 구성하기

- textView

  : text, textsize, gravity, margin, layout 사이즈 지정(문제가 2줄로 나올 때도 버튼 위치 변동 없도록.) 사용

- Widgets/progressbar : 진행상태 표시하기

  : max(문제 개수 설정), margin

- textView

  : text, textsize, gravity, margin 사용

- Button 2개 

  : text, textsize, background tint

 

2. 문제들을 res/calues/strings.xml 에 작성한다.

- 글로벌 서비스 위해서 문자열 파일에 다 넣어준다.

<resources>
	# 기존에 있던 것
    <string name="app_name">Quiz</string>
	# 내가 작성한 퀴즈 문제들
    <string name="q1">지구는 태양 주위를 돈다.</string>
    <string name="q2">서울은 대한민국의 수도가 아니다.</string>
    <string name="q3">물은 화학식으로 H2O를 가진다.</string>
    <string name="q4">북극은 남극보다 따뜻하다.</string>
    <string name="q5">대한민국의 공식 언어는 영어다.</string>
    <string name="q6">사람의 심장은 하루에 약 100,000번 뛴다.</string>
    <string name="q7">에베레스트 산은 세계에서 가장 높은 산이다.</string>
    <string name="q8">피타고라스의 정리는 삼각형의 세 변의 길이에 대한 이론이다.</string>
    <string name="q9">아폴로 11호는 화성에 착륙한 최초의 우주선이다.</string>
    <string name="q10">컴퓨터의 CPU는 중앙 처리 장치를 의미한다.</string>
</resources>

 

3. 자바 파일에서 화면을 연결한다.

- Id 이름 정리하고, 변수 만들기

- findViewById(); 사용해서 변수에 저장하기

    TextView txtQuiz;
    ProgressBar progressBar;
    TextView txtResult;
    Button btnTrue;
    Button btnFalse;
    
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        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);
        }

 

4. 퀴즈를 만들기 위해, 패키지를 만든다.

- 모델 패키지 안에 클래스를 만든다.

 

5. Quiz 클래스 불러오기

- 어레이 리스트로 만들어서 퀴즈를 저장한다.

- 반복문으로도 저장할 수 있다.

public class MainActivity extends AppCompatActivity {

    ArrayList<Quiz> quizArrayList = new ArrayList<>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        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);
        }
    }

- 너무 기니까 메서드로 만들어서 사용한다.

// 위에 창 누르면 만들어지는 메소드
private void setQuiz() {
}

 

6. 화면에 퀴즈를 출제한다.

6-1. 어레이리스트에서 퀴즈 가져오기

        // 1. 퀴즈를 만든다!!
        // 위에서 만든 함수
        setQuiz();
       
        // 2. 화면에 퀴즈를 출제한다.
        Quiz quiz = quizArrayList.get(currentQuizIndex);
        txtQuiz.setText( quiz.getQuestion() );

 

 

6-2. progressBar에 진행상황을 표시한다.

- 위에 get() 은 인덱스 이기 때문에 get()과는 항상 1 차이가 난다.

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

 

6-3. 유저가 답을 주면 처리해 준다.

- 버튼으로 답을 받으면 조건문으로 답을 해준다.

- 다음 문제가 바로 나올 수 있게 작성한다.

        // 버튼
        btnTrue.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Quiz quiz = quizArrayList.get(currentQuizIndex);
                if( quiz.isAnswer() == true ){
                    txtResult.setText("정답입니다~~");
                    correct = correct + 1;
                } else {
                    txtResult.setText("오답입니다~~");
                }
                
                // 다음문제를 화면에 출제한다.
                currentQuizIndex = currentQuizIndex + 1;
                quiz = quizArrayList.get(currentQuizIndex);
                txtQuiz.setText(quiz.getQuestion());
                // 프로그레스바도 1 증가시킨다.
                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("정답입니다~~");
                    correct = correct + 1;
                }else {
                    txtResult.setText("오답입니다~~");
                }
                // 다음문제를 화면에 출제한다.
                currentQuizIndex = currentQuizIndex + 1;
                quiz = quizArrayList.get(currentQuizIndex);
                txtQuiz.setText(quiz.getQuestion());
                // 프로그레스바도 1 증가시킨다.
                progressBar.setProgress(currentQuizIndex+1);
            }
        });

- correct 변수를 만들어서 맞춘 개수를 저장할 수 있는 멤버 변수를 만든다.

private int correct;

 

6-4. 인덱스 번호를 멤버 변수로 만든다.

- 로컬 변수 아니다!! 인덱스 번호를 한 개의 함수에서만 쓰는 것이 아니기 때문에 heap 메모리에 저장해야 한다.

- 처음 변수 저장될 때 int는 바로 0으로 저장되므로 바로 인덱스 변수로 사용했다.

    private int currentQuizIndex;

 

 

7. 유저가 문제를 다 풀었으면, 유저가 누를 수 있는 팝업이 뜨게 만들자.

- showAlertDialog(); 만들기

  메인 액티비티로 설정해서 메서드 만들기.

    private void showAlertDialog() {

        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setCancelable(false);
        builder.setTitle("퀴즈 끝");
        builder.setMessage("지금까지 맞춘 문제는 몇개 입니다. 다시풀기를 누르면 퀴즈가 다시 시작되고, 종료를 누르면 퀴즈앱이 종료됩니다.");
        builder.setPositiveButton("다시 풀기", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // 다시 풀기는 데이터를 초기화 시켜줘야 한다.
                currentQuizIndex = 0;
                // 1. 첫번째 문제가 다시 화면에 나와야 한다.
                Quiz quiz = quizArrayList.get(currentQuizIndex);
                txtQuiz.setText( quiz.getQuestion() );
                // 2. 프로그레스바도 처음부터 나와야 한다.
                progressBar.setProgress(currentQuizIndex + 1);
                // 3. 결과 화면도 초기화 한다.
                txtResult.setText("결과");
                // 4. 정답 개수도 초기화 한다.
                correct = 0;

            }
        });
        builder.setNegativeButton("종료", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // 현재의 엑티비티를 종료시키는 함수! finish()
                finish();
            }
        });
        builder.show();
    }    private void showAlertDialog() {

        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setCancelable(false);
        builder.setTitle("퀴즈 끝");
        builder.setMessage("지금까지 맞춘 문제는 몇개 입니다. 다시풀기를 누르면 퀴즈가 다시 시작되고, 종료를 누르면 퀴즈앱이 종료됩니다.");
        builder.setPositiveButton("다시 풀기",null);
        builder.setNegativeButton("종료", null);
        builder.show();
    }

 

 

dialog