P17 数当てゲーム

Android開発に関するメモランダム

カテゴリー: Androidプログラミング入門 - 独りで学べるスマホアプリの作り方 -  閲覧数:310 配信日:2018-05-09 12:22


エラー対応


Unsupported method: BaseConfig.getApplicationIdSuffix().

範囲の選択項目


ArrayAdapterを使用して用意

選択項目に使用するユーザ定義クラスRange
・ジェネリクスを使用して指定
ArrayAdapter<Range> adapter = new ArrayAdapter<>(
       this,
       android.R.layout.simple_spinner_dropdown_item,
       RANGES
);

ArrayAdapterクラス
・データの一覧をリストなどのビューに渡すために使用されるクラス
ジェネリクス(Generics)

コード


▼sample1/MainActivity.java
package biz.answerlead.sample1;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

/** メイン画面。画面を担当するクラスは、Activityクラスを継承する必要がある */
public class MainActivity extends Activity implements AdapterView.OnItemSelectedListener, View.OnClickListener, TextView.OnEditorActionListener {

   /** デバッグログ用タグ */
   private static final String TAG = "SAMPLE_LOG";

   /** 範囲の種類を定義 */
   private static final Range[] RANGES = new Range[]{
           new Range(1, 100),
           new Range(1, 1000),
           new Range(1, 10000)
   };

   /** 範囲選択用スピナー */
   private Spinner range_spinner;

   /** 答え入力欄 */
   private EditText answer_edit_text;

   /** 答え決定ボタン */
   private Button answer_button;

   /** 正解値 */
   private int right_value;

   @Override
   protected void onCreate(Bundle savedInstanceState) {

       // デバッグログを出力
       Log.d(TAG, "onCreate");

       // 親クラスのonCreateを呼ぶ
       super.onCreate(savedInstanceState);

       // layoutの内容を画面に反映。レイアウトのリソースを読み込んで画面に反映するメソッド。プログラム中でリソースを参照する場合は、自動で作成されるRクラスに定義されているリソースIDを使用する
       setContentView(R.layout.activity_main);

       // スピナーに選択項目を設定するためのアダプターを作成
       ArrayAdapter<Range> adapter = new ArrayAdapter<>(
               this,
               android.R.layout.simple_spinner_dropdown_item,
               RANGES
       );

       // IDから範囲選択スピナーのインスタンスを取得
       range_spinner = (Spinner) findViewById(R.id.rangeSpinner);

       // スピナーにアダプターを設定
       range_spinner.setAdapter(adapter);

       // スピナーの項目が選択された際のイベントを設定
       range_spinner.setOnItemSelectedListener(this);

       // 答え入力欄に、キーボードの「実行」ボタンが押された時のイベントを設定
       answer_edit_text = (EditText) findViewById(R.id.answerEditText);
       answer_edit_text.setOnEditorActionListener(this);

       // 答えの決定ボタンに、押された際のイベントを設定
       answer_button = (Button) findViewById(R.id.answerButton);
       answer_button.setOnClickListener(this);
   }

   @Override
   public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

       // デバッグログを出力
       Log.d(TAG, "onItemSelected");

       // イベントが発生したViewのIDで処理を分岐
       switch (parent.getId()) {

           // 範囲選択スピナーならば
           case R.id.rangeSpinner:

               // 正解の値を抽選
               chooseValue();
               break;
       }
   }

   @Override
   public void onNothingSelected(AdapterView<?> parent) {
       // 項目の選択が解除された際のイベント。Spinnerでは発生しない。
   }

   /** 正解の値を抽選するメソッド */
   private void chooseValue() {

       // 範囲選択スピナーから選択されている項目を取得
       Range range = (Range) range_spinner.getSelectedItem();

       // 正解の値を抽選
       right_value = range.getRandomValue();
   }

   @Override
   public void onClick(View v) {

       // デバッグログを出力
       Log.d(TAG, "onClick");

       // イベントが発生したViewのIDで処理を分岐
       switch (v.getId()) {

           // 答え決定ボタンならば
           case R.id.answerButton:

               // 正解チェック
               answerCheck();
               break;
       }
   }

   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

       // デバッグログを出力
       Log.d(TAG, "onEditorAction");

       // イベントが発生したViewのIDで処理を分岐
       switch (v.getId()) {

           // 答え入力欄ならば
           case R.id.answerEditText:

               // 「実行」イベントならば
               if (actionId == EditorInfo.IME_ACTION_GO) {

                   // 正解チェック
                   answerCheck();

                   // デフォルトの動作をキャンセル
                   return true;
               }
               break;
       }
       return false;
   }

   /** 正解判定 */
   private void answerCheck() {

       // 入力内容を取得
       String input_text = answer_edit_text.getText().toString();

       // 判定結果を格納する変数
       String result;

       try {
           // 入力内容は文字列として取得されているので、数値に変換
           int answer = Integer.parseInt(input_text);

           // 正解値の方が大きい場合
           if (answer < right_value) {

               // リソースから文字列を取得し、%dに入力値を当てはめる
               result = String.format(getString(R.string.bigger), answer);
           }
           // 正解値の方が小さい場合
           else if (answer > right_value) {

               // リソースから文字列を取得し、%dに入力値を当てはめる
               result = String.format(getString(R.string.smaller), answer);
           }
           // どちらでもない(等しい)場合
           else {

               // リソースから文字列を取得する
               result = getString(R.string.right);

               // 値を再抽選する
               chooseValue();
           }
       } catch (NumberFormatException e) {

           // 何らかの不正な値が入力された場合はエラーメッセージをリソースから取得
           result = getString(R.string.error_input);
       }

       // IDから結果表示欄のインスタンスを取得
       EditText result_edit_text = (EditText) findViewById(R.id.resultEditText);

       // 結果表示欄の現在のテキストを取得
       Editable text = result_edit_text.getText();

       // 現在のテキストが空でなければ改行を結合
       if (text.length() > 0) {
           text.append("\n");
       }

       // 今回の結果を結合
       text.append(result);

       // 結果表示欄を末端までスクロール
       result_edit_text.setSelection(text.length());

       // 答え入力欄を空にする
       answer_edit_text.setText("");
   }
}


▼biz/answerlead/sample1/Range.java
package biz.answerlead.sample1;

/** 値の範囲を管理するクラス */
class Range {

   /** 最小値 */
   private int min;

   /** 最大値 */
   private int max;

   /** コンストラクタ */
   public Range(int min, int max) {
       this.min = min;
       this.max = max;
   }

   /** 範囲の中から整数を取得する */
   public int getRandomValue(){
       return (int)Math.floor(Math.random() * (max - min + 1)) + min;
   }

   @Override
   public String toString() {
       return String.valueOf(min + "~" + max);
   }
}


週間人気ページランキング / 11-17 → 11-23
順位 ページタイトル抜粋 アクセス数
アクセスが、ありませんでした! 0
2024/11/24 1:01 更新
指定期間人気ページランキング / 1970-1-1 → 2024-11-23
順位 ページタイトル抜粋 アクセス数
アクセスが、ありませんでした! 0
2024/11/24 1:01 更新