AndroidStudioでアプリ作成(2)MainActivity.java


Androidへ戻る

 

 

(1)で作成したレイアウトを使い実際の処理をMainActivity.javaに記述する。

1.MainActivity.javaでプログラムを作成する際には既存のプログラムをImportして使用します。処理を記述したときにImportが必要と思われるときAndroidStudioは下図の様な表示でImportをうながします。Importの方法はAltキーを押したままEnterキーを押します。

上記MenuAltキーを押したままEnterキーを押すと初期には2項目だったImport3項目に増えます。


2.計算ボタンを押したときの計算処理を記述する。
@作成直後は基本的な部分のみでこれだけではレイアウトが表示だけで何も起こらない。

Axmlファイルから処理を追加する。(javaファイルに直接記述も可能)
Design画面のボタンをクリックしボタンのAttributes(属性)画面を表示

onClik欄の空欄にプログラム内で分かりやすい名前(例:button_clck)を記述しエンター

xmlファイルのTextに切り替えるとButtonグループにandroid:onClick="button_clck"が追加され、button_clckにアンダーラインが表示されている。

button_clckをクリックすると左側に💡が表示される。💡をクリックすると処理候補がでるのでCreate”button------をクリックする。

MainActivity.java内に
public void button_clck(View view) {

    }
が作成される。{ }の間に計算ボタンが押された時に実行する内容を記述する。

B計算処理の記述。public void button_clck(View view) {    }
   //editText欄に入力された値をeditTextにとりこむ

        EditText editText1 = (EditText)findViewById(R.id.editText1);

        EditText editText2 = (EditText)findViewById(R.id.editText2);

       //取込んだ値を数値に変換し変数aなどへ代入

        int a = Integer.parseInt(editText1.getText().toString());

        int b = Integer.parseInt(editText2.getText().toString());

        int c = a + b;

 

       //計算結果cを文字列に変換しtextViewに表示

         TextView textView = (TextView)findViewById(R.id.textView5);

         textView.setText(String.valueOf(c));

//以降1行は注釈文でプログラムに影響しないコメント










C計算処理を記述したjavaファイル。EditTextなど Importしてない所が赤字で表示されているので1項の方法で既存のプログラムをImportする。



3.作成したプログラムを動かしてみる。エミュレータは動作が遅いので実機がベター
@実行ボタンを押す。

Aターゲットを選びOKを押す。今回はConnectedDevices(実機)を選択



B作成したプログラムが表示される。

C数値を入力し計算ボタンを押してみる。

※数字のサイズや位置、キーボードなどの体裁は後で整える。

4.答を判定し正誤を画像で表示する。
@表示する事前に準備した画像を取込む。(egao .pngnakigao.pngtakayasiro.pngを用意した。Jpgだとエラーする事がある?)
・事前に用意して画像(例:egao.png)をコピー

resdrawableを選び右クリックしPaste

Choose画面では上(v24の無い方)を選びOKをクリック

Copy画面でOKをクリック。

・同様にnakigao.pngtakayasiro.pngdrawableフォルダに取込む

xmlファイルのImageViewグループにbuckgroundの指定が有れば削除しておく。

AjavaファイルにImageViewに判定前の初期表示(今回はtakayasiro.jpg)を追加する。
下図の@とA



B入力された答えを変数dに代入する。下図BとC

C答dと正解cを比較し正解なら笑顔、不正解なら泣顔を表示する。下記D〜G

5.効果音をつける(calcssakusei5
@効果音用フォルダー作成
resで右クリックNewDirectoryで作成

・フォルダー名を付ける(今回はraw






resの下にrawフォルダーが作成される

A効果音の追加
・準備した効果音を選択しコピー(今回は下図のseikaifuseikaiを準備した)

rawフォルダーにpast

・貼り付け先確認でOK


rawフォルダに効果音が追加される。  以下が出た場合はOpen matchingを選択。
      
B効果音用変数の準備
javaファイルの先頭近くにHを記述する。

C効果音使用(SoundPoolの初期設定)
SoundPoolの初期設定Iを記述する

D効果音の指定
mp3a,mp3bに音源を指定する。J





E判定に従い音を鳴らす
・判定表示に正解ならmp3a、不正解ならmp3b Kを記述する。

6.戻るボタンの追加
@下図を参考に【もう一回】ボタンを追加する。今回はidbutton2とした。あわせてimageViewの背景をbackground_light(透明)とした。

AMainActivity.javabutton_clikの処理を追加する。

7.小数点付や符号付の入力に対応させる。
@xmleditTextinputType numbernumberSigned(符号付)とnumberDecimal(小数入力)textPersonNameにチェックを入れる。

AjavaファイルのeditTextの文字列から数値変換整数(INT型)を浮動小数点(float型)に変更する。


8.値や答えが未入力対応
 ここまでで一応計算と判定・表示が出来るようになったが値を入力しないで計算ボタンを押すと画面が消えてしまうので未入力時に警告を表示し画面が消えないようにする。
 処理の概略手順
・入力値を空白の判定し計算できる様数値に変換するので扱いやすいように文字変数を用意する。
・入力された値を文字変数に取込む
・入力された値のどれかが空白なら警告文を表示
・全て入力済なら前項までと同様数字に変換し計算・判定・表示する。もう一回のボタンは変更なし。
@以下の場所にString text13の文字列変数を宣言する。@部分
public class MainActivity extends AppCompatActivity {

    // 効果音再生準備

    SoundPool soundPool;    // 効果音を鳴らす本体(コンポ)

    int mp3a;          // 効果音データ(mp3

    int mp3b;          // 効果音データ(mp3

  //入力された値を取込む為の文字変数                                                         @

    String text1;       //editTextの文字列宇取得するための変数

    String text2;

    String text3;

 

    @Override
Apublic void button_clck内で入力された値を文字変数に取込む。A部分
public void button_clck(View view) {

        //editTextに入力された値を文字にとりこむ

        EditText editText1 = (EditText) findViewById(R.id.editText1);

        String text1 = editText1.getText().toString();    //text1editText1の中身をセット A

 

        EditText editText2 = (EditText) findViewById(R.id.editText2);

        String text2 = editText2.getText().toString();    //text2editText2の中身をセット A

 

        //入力された答えを変数dに代入する

        EditText editText3 = (EditText) findViewById(R.id.editText3);

        String text3 = editText3.getText().toString();    //text3editText3の中身をセット A

 

        //入力が空白の場合の警告                                                                                      
B入力された値のどれかが空白なら警告文を表示
//入力が空白の場合の警告                                                                                                                            B

        if (text1.equals("") || text2.equals("") || text3.equals("")) {                                //値1,2答のどれかが空白なら

            // Toast.makeText(view.getContext(), "入力してください", Toast.LENGTH_SHORT).show();

            Toast.makeText(view.getContext(), "入力してください", Toast.LENGTH_LONG).show();          //B

        }       

           else {                           

C全て入力済なら前項までと同様数字に変換し計算・判定・表示する。
                   else {                                                                                    //3項目とも入力があれば            C

                   //入力後の処理 文字列を浮動小数点数に変換

            float a = Float.parseFloat(text1);

            float b = Float.parseFloat(text2);

            float d = Float.parseFloat(text3);

            float c = a + b;

            //答を文字列に変換し表示

            TextView textView = (TextView)findViewById(R.id.textView5);

            textView.setText(String.valueOf(c));

 

            //判定し正解なら笑顔とファンファーレ不正解なら泣き顔とぎゃふん音を表示する

            if(c==d) {

                ImageView imageViews = findViewById(R.id.imageView);      

                imageViews.setImageResource(R.drawable.egao);              

                //効果音を流す

                soundPool.play(mp3a,1f , 1f, 0, 0, 1f);                

 

            }

            else{

8.計算時の誤差・桁落ちを防止する。1.1111+1.1112.2220998など
@入力値を一旦BigDecimal型変数に変換し計算する。BigDecimalクラスでは、実数値を「整数値」として扱い、この値と「小数点の位置」を別々に管理することで、実数値を丸め誤差なしに格納する。
 else {

            /****以下を注釈に

            float a = Float.parseFloat(text1);

            float b = Float.parseFloat(text2);

            float d = Float.parseFloat(text3);

            float c = a + b;

             以上までを注釈に********/

            //誤差桁落ち防止のためBigDecimalで計算今回はjavaクラスでimportしてみた

            BigDecimal a = new BigDecimal(text1);

            BigDecimal b = new BigDecimal(text2);

            float d = Float.parseFloat(text3);

            //誤差の無い計算BigDecimalデータの加算

            float c = a.add(b).floatValue();

            //答を文字列に変換し表示

以降変更は不要です。

 

※詳細はMainActivity.javaの中身.txtを参照