カテゴリー:
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
);
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);
}
}