▶ 10개의 퀴즈가 있다, 이 퀴즈를 참 또는 거짓 버튼을 눌러 맞추는 앱을 만들것이다.
1. xml 파일로 화면 구성하기
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/txtQuiz"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="68dp"
android:layout_marginRight="20dp"
android:gravity="center"
android:text="퀴즈"
android:textSize="26sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="44dp"
android:layout_marginRight="20dp"
android:max="10"
android:progress="3"
android:progressTint="#E91E63"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtQuiz" />
<TextView
android:id="@+id/txtResult"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="89dp"
android:layout_marginRight="20dp"
android:gravity="center"
android:text="결과"
android:textSize="26sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/progressBar" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="81dp"
android:layout_marginRight="20dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtResult">
<Button
android:id="@+id/btnTrue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="20dp"
android:layout_weight="1"
android:backgroundTint="#2196F3"
android:text="참"
android:textSize="26sp" />
<Button
android:id="@+id/btnFalse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:backgroundTint="#CA2A2A"
android:text="거짓"
android:textSize="26sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
더보기
android:max="10"
▷ progressBar의 최대치가 10이란 뜻 즉 progressBar를 10등분하여 한 문제 풀 때마다 바의 색이 1등분씩 체워진다.
2. Quiz 클래스 만들어주기
클래스를 만들기 전에 해당 클래스를 저장할 model 패키지를 만들어준다.
package com.example.quiz.model;
public class Quiz {
public int question;
public boolean answer;
public Quiz(int question, boolean answer) {
this.question = question;
this.answer = answer;
}
}
▷ Quiz 클래스는 문제와 답으로 구성되어있다.
3. MainActivity 코드 추가
그 전에 앱에서 사용할 Quiz들을 strings.xml파일에 저장하자!
<resources>
<string name="app_name">QuizApp</string>
<string name="my_laptop_name">Macbook Pro</string>
<string name="correct_text">Correct!</string>
<string name="incorrect_text">Incorrect!</string>
<string name="first_score_text">0/10</string>
<string name="correct_toast_message">Great!</string>
<string name="incorrect_toast_message">Not good!</string>
<string name="q1">A honey bee can fly at 15mph.</string>
<string name="q2">A jellyfish is approximately 95% water.!</string>
<string name="q3">Elephants are the only mammals that can\'t jump</string>
<string name="q4">Cats can hear ultrasound.</string>
<string name="q5">A human brain weighs about three pounds.</string>
<string name="q6">The tongue is the fastest healing part of the body.</string>
<string name="q7">Americans, on average, eat 18 acres of \"pizza\" a day.</string>
<string name="q8">A kangaroo can jump 30 feet.</string>
<string name="q9">A pigeon\'s feathers are heavier than its bones.</string>
<string name="q10">The tallest man was 8 ft. 11 in.</string>
</resources>
package com.example.quiz;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
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 com.example.quiz.model.Quiz;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
TextView txtQuiz;
ProgressBar progressBar;
TextView txtResult;
Button btnTrue;
Button btnFalse;
// 퀴즈 저장용 멤버 변수
ArrayList<Quiz> quizArrayList = new ArrayList<>();
Quiz quiz;
int currentQuizIndex = 0;
int answer = 0;
// AlertDiaLog 알러트 다이얼로그 만들기
private void showAlertDialog(){ // 3개 제공해준다
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("퀴즈 끝~");
builder.setMessage("맞춘 문제 갯수: "+answer);
// 이 다이얼 로그의 외곽 부분을 눌렀을 때, 사라 지지 않도록 하는 코드
builder.setCancelable(false);
builder.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
// 퀴즈를 처음부터 다시 풀 수 있도록 할 것이다.
currentQuizIndex = 0;
Quiz quiz = quizArrayList.get(currentQuizIndex);
txtQuiz.setText(quiz.question);
txtResult.setText("결과");
txtResult.setText("결과");
progressBar.setProgress(currentQuizIndex+1,true);
answer = 0;
}
});
builder.setNegativeButton("종료", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
// 현재의 액티비티(MainActivity)를 종료시키는 코드! 앱을 종료시키는게 아님
finish();
}
});
builder.show();
}
void setQuiz(){
Quiz q1 = new Quiz(R.string.q1, true);
Quiz q2 = new Quiz(R.string.q2, false);
Quiz q3 = new Quiz(R.string.q3, true);
Quiz q4 = new Quiz(R.string.q4, false);
Quiz q5 = new Quiz(R.string.q5, true);
Quiz q6 = new Quiz(R.string.q6, false);
Quiz q7 = new Quiz(R.string.q7, true);
Quiz q8 = new Quiz(R.string.q8, false);
Quiz q9 = new Quiz(R.string.q9, true);
Quiz q10 = new Quiz(R.string.q10, false);
quizArrayList.add(q1);
quizArrayList.add(q2);
quizArrayList.add(q3);
quizArrayList.add(q4);
quizArrayList.add(q5);
quizArrayList.add(q6);
quizArrayList.add(q7);
quizArrayList.add(q8);
quizArrayList.add(q9);
quizArrayList.add(q10);
}
private boolean getQuiz(){
if (currentQuizIndex >= quizArrayList.size()) {
txtResult.setText("맞춘 문제 갯수: "+answer);
// 팝업을 띄우자.
showAlertDialog();
return false;
}
quiz = quizArrayList.get(currentQuizIndex);
txtQuiz.setText(quiz.question);
progressBar.setProgress(currentQuizIndex+1,true);
currentQuizIndex = currentQuizIndex + 1;
return true;
}
@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);
// 퀴즈를 내야 한다.
// 퀴즈를 먼저 메모리에 변수로 만들어야 한다.
// 퀴즈가 여러개니까, 여러개를 하나의 변수로 처리할 수 있는 데이터 스트럭쳐가 필요하고,
// 자바의 가장 유용한 데이터스트럭처, 어레이리스트 사용한다.
// R. 으로하는건 다 숫자여서 R.string.q1쓰면 에러가난다
setQuiz(); // 코드가 너무 기니까 함수로 만들어줘서 쓴다 실무에서도!
progressBar.setProgress(1,true);
// 문제를 출제한다.
quiz = quizArrayList.get(0);
// 화면에 표시
txtQuiz.setText(quiz.question);
btnTrue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!getQuiz()){
return;
}
if(quiz.answer == true){
txtResult.setText("정답입니다.");
answer += 1;
}else{
txtResult.setText("오답입니다.");
}
}
});
btnFalse.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!getQuiz()){
return;
}
if(quiz.answer == false){
txtResult.setText("정답입니다.");
answer += 1;
}else{
txtResult.setText("오답입니다.");
}
}
});
}
}
'모바일 프로그래밍(Android Studio)' 카테고리의 다른 글
데이터를 파일로 저장해서 불러오기 (0) | 2023.07.11 |
---|---|
The activity lifecycle(활동 수명 주기) (0) | 2023.07.10 |
Timer 앱 (0) | 2023.07.07 |
UI 위젯 기초, 실행화면 보기 (0) | 2023.07.06 |
앱 생성 기초 (0) | 2023.07.05 |