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();
}
'Android Studio' 카테고리의 다른 글
[Android Studio] Snackbar / Toast 사용하는 방법 (0) | 2024.06.05 |
---|---|
[Android Studio] LinearLayout 2가지 종류 _ horizontal, veltical (0) | 2024.06.05 |
[Android Studio] 엑티비티에 사람모양 아이콘 넣기 _Vector Asset (0) | 2024.06.05 |
[Android Studio] 유저가 보낸 데이터 로그에서 확인하는 방법 (0) | 2024.06.05 |
[Android Studio] Emulator 한국어 키보드 나오게 설정하기 (0) | 2024.06.05 |