初めてjavaでアプリを作ってみよう、という人向けに、簡単な「四択クイズアプリ」の作り方実況解説をしました。主な学習テーマは「2次元配列」とその表示、そして「シャッフル」です。
※2次元配列の理解が目的なので、ややコードが稚拙だったり、アプリとしては未完成だったりしますがご了承ください
▼作業環境
OS:win10
AndroidStudio:4.0.2
言語:java
動画解説
テキスト解説
▼xml(レイアウト)
<LinearLayout 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" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:id="@+id/tvCount" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:text="あと●問" android:textSize="24sp" /> <TextView android:id="@+id/tvQuestion" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="50dp" android:text="question" android:textSize="30sp" /> <Button android:id="@+id/ansBtn1" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginTop="50dp" android:layout_weight="1" android:onClick="onButton" android:text="ans1" /> <Button android:id="@+id/ansBtn2" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:onClick="onButton" android:text="ans2" /> <Button android:id="@+id/ansBtn3" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:onClick="onButton" android:text="ans3" /> <Button android:id="@+id/ansBtn4" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:onClick="onButton" android:text="ans4" /> <Button android:id="@+id/nextBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:onClick="onNext" android:text="next" /> </LinearLayout>
▼プログラミング(java)
import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.util.Arrays; import java.util.Collections; import java.util.List; public class MainActivity extends AppCompatActivity { //どのメソッドからでも使えるための準備 private TextView tvCount; private TextView tvQuestion; private Button ansBtn1; private Button ansBtn2; private Button ansBtn3; private Button ansBtn4; private Button nextBtn; private int i =0; //1)クイズデータを準備 String quizData[][] = { // {"問題", "正解", "選択肢1", "選択肢2", "選択肢3"} {"問題A", "A1", "A2", "A3", "A4"}, {"問題B", "B1", "B2", "B3", "B4"}, {"問題C", "C1", "C2", "C3", "C4"}, {"問題D", "D1", "D2", "D3", "D4"}, {"問題E", "E1", "E2", "E3", "E4"} }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //2)idを取得 getId(); //3)クイズを表示(練習) // tvCount.setText("残り5問"); // tvQuestion.setText(quizData[0][0]); // ansBtn1.setText(quizData[0][1]); // ansBtn2.setText(quizData[0][2]); // ansBtn3.setText(quizData[0][3]); // ansBtn4.setText(quizData[0][4]); showQuiz(); } //まずidを取得して準備 public void getId(){ tvCount = findViewById(R.id.tvCount); tvQuestion = findViewById(R.id.tvQuestion); ansBtn1 = findViewById(R.id.ansBtn1); ansBtn2 = findViewById(R.id.ansBtn2); ansBtn3 = findViewById(R.id.ansBtn3); ansBtn4 = findViewById(R.id.ansBtn4); nextBtn = findViewById(R.id.nextBtn); } //3)クイズを表示 public void showQuiz(){ //4)シャッフル List<Integer> num = Arrays.asList(1,2,3,4); Collections.shuffle(num); tvCount.setText("残り" + (5-i) + "問"); tvQuestion.setText(quizData[i][0]); ansBtn1.setText(quizData[i][num.get(0)]); ansBtn2.setText(quizData[i][num.get(1)]); ansBtn3.setText(quizData[i][num.get(2)]); ansBtn4.setText(quizData[i][num.get(3)]); } //5)ボタンが押されたときの正誤判定 public void onButton(View view){ //押されたボタン Button clickedBtn =(Button)view; String clickedAns =clickedBtn.getText().toString(); if(clickedAns.equals(quizData[i][1])){ clickedBtn.setText("正解!"); //ボタンを無効化、ネクストボタンを有効化 ansBtn1.setEnabled(false); ansBtn2.setEnabled(false); ansBtn3.setEnabled(false); ansBtn4.setEnabled(false); nextBtn.setEnabled(true); //i++; if(i ==4){ //7)アクティビティ画面作成 //8)画面遷移 Intent intent = new Intent(this,Result.class); startActivity(intent); finish(); }else{ i++; } }else{ clickedBtn.setText("不正解!"); tvQuestion.setText("Game over"); //ボタンを無効化 ansBtn1.setEnabled(false); ansBtn2.setEnabled(false); ansBtn3.setEnabled(false); ansBtn4.setEnabled(false); nextBtn.setEnabled(false); } } //6)Nextボタンが押された時の処理 public void onNext(View view){ showQuiz(); ansBtn1.setEnabled(true); ansBtn2.setEnabled(true); ansBtn3.setEnabled(true); ansBtn4.setEnabled(true); } }
▼Result.xml
<LinearLayout 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" android:background="#FFEB3B" android:gravity="center" android:orientation="vertical" tools:context=".Result"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="全問正解!ゲームクリア!" android:textSize="30sp" /> </LinearLayout>
▼Result.java
import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; public class Result extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_result); } }
主なポイント
1)2次元配列の表示
「たて0番目、横1番目」みたいな時には、こんな感じで書きます。
ansBtn1.setText(quizData[0][1]);
2)シャッフル
1~4までの数字(int)をシャッフルさせるときはこのように書きます。
List<Integer> num = Arrays.asList(1,2,3,4); Collections.shuffle(num);