Androidプログラミングに挑戦2!(14)単位変換アプリを作る(その5)

0
    JUGEMテーマ:プログラミング

    さてさて、最終形態が近づいてきました。
    今回で、機能としては最終版にもっていきたいと思います。

    残る課題は、そうあれです、重さ、長さ、速度、等の系統ごとにドロップダウンメニューの中身が切り替わるようにしてやる、と宣言したやつです。

    いつものように、レイアウトから作っていきましょう。
    今回はこちらになります。


    1段目に、カテゴリーを選択するスピナーが追加になりました。
    あとは前回と同じで、入力、出力ともにスピナーで単位を選んで変換ボタンをタップする方式です。
    カテゴリーを選択すると、単位用スピナーの内容が切り替えられる仕組みを考えています。

    次に、リソースのstrings.xmlがこちらです。
    <resources>
        <string name="app_name">UnitConverter4</string>
        <string name="categoryText">カテゴリー:</string>
        <string name="initialValue">0.0</string>
        <string name="convert">変換</string>
        <string-array name="category">
            <item>長さ</item>
            <item>面積</item>
            <item>体積</item>
            <item>重さ</item>
        </string-array>
        <string-array name="unitListLength">
            <item>m</item>
            <item>km</item>
            <item>mile</item>
        </string-array>
        <string-array name="unitListArea">
            <item>m2</item>
            <item>a</item>
            <item>ha</item>
        </string-array>
        <string-array name="unitListVolume">
            <item>m3</item>
            <item>cc</item>
            <item>L</item>
        </string-array>
        <string-array name="unitListWeight">
            <item>kg</item>
            <item>lb</item>
            <item>貫</item>
        </string-array>
    </resources>
    

    画面表示用の文字列に続き、string-arrayでまずカテゴリースピナー用のリソースを用意しています。とりあえず、長さ、面積、体積、重さ、の4種類を登録しましたので、次にそれぞれに対する単位スピナー用のリソースを登録しています。

    そうしたら、これらを動かすjavaコードを見ていきましょう。
    ちょっと長くなりますが、全文表示しちゃいましょう。
    package com.example.tetsuya.unitconverter4;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    // 中で使用するEditText, TextView, Viewをimport
    import android.widget.ArrayAdapter;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.view.View;
    import android.widget.Spinner;
    import android.widget.AdapterView.OnItemSelectedListener;
    import android.widget.AdapterView;
    public class UnitConverter4 extends AppCompatActivity {
        // 使用する変数等を定義
        EditText editText;
        TextView textView2;
        double convRatioInput = 1.0;
        double convRatioOutput = 1.0;
        double inputValue = 0.0;
        double outputValue = 0.0;
        int categoryNumber = 0;
        String input;
        String[] unitList;
        Spinner categorySpinner;
        Spinner unitSpinnerInput;
        Spinner unitSpinnerOutput;
        ArrayAdapter adapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_unit_converter4);
            // 入力エリアと出力表示エリアのインスタンスを取得
            editText = (EditText) findViewById(R.id.editText);    // 入力エリア
            textView2 = (TextView) findViewById(R.id.textView2);    // 出力エリア
            categorySpinner = (Spinner) findViewById(R.id.spinner);     // カテゴリースピナー
            unitSpinnerInput = (Spinner) findViewById(R.id.spinner2);     // 入力単位スピナー
            unitSpinnerOutput = (Spinner) findViewById(R.id.spinner3);     // 出力単位スピナー
            // 変換ボタンのオンクリックリスナーを設定
            findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) { // ボタンクリック時の処理を定義
                    // 入力欄に記入されたテキストを取得
                    input = editText.getText().toString();
                    // 取得したテキストを数値に変換
                    if (!input.equals("")) {
                        inputValue = Double.parseDouble(input);
                    } else {
                        inputValue = 0;
                    }
                    // 入力単位→出力単位に変換
                    outputValue = inputValue * convRatioInput / convRatioOutput;
                    // 変換した数値を文字列として出力エリアにセット
                    textView2.setText(String.format("%.10g", outputValue));
                }
            });
            // 入力単位spinnerのアイテムセレクトリスナーを設定
            // リスナーを登録
            unitSpinnerInput.setOnItemSelectedListener(new OnItemSelectedListener() {
                // アイテムが選択された時
                public void onItemSelected(AdapterView<?> parent, View viw, int arg2, long arg3) {
                    int idx = unitSpinnerInput.getSelectedItemPosition();
                    if (categoryNumber==0) {    // 長さ
                        switch(idx){
                            case 0: // m
                                convRatioInput = 1.0;
                                break;
                            case 1: // km
                                convRatioInput = 1000.0;
                                break;
                            case 2: // mile
                                convRatioInput = 1609.334;
                                break;
                        }
                    }else if(categoryNumber==1){    // 面積
                        switch(idx){
                            case 0: // m2
                                convRatioInput = 1.0;
                                break;
                            case 1: // a
                                convRatioInput = 100.0;
                                break;
                            case 2: // ha
                                convRatioInput  = 10000.0;
                                break;
                        }
                    }else if(categoryNumber==2){    // 体積
                        switch(idx){
                            case 0: // m3
                                convRatioInput = 1.0;
                                break;
                            case 1: // cc
                                convRatioInput = 0.000001;
                                break;
                            case 2: // L
                                convRatioInput = 0.001;
                                break;
                        }
                    }else if(categoryNumber==3){    // 重さ
                        switch (idx) {
                            case 0: // kg
                                convRatioInput = 1.0;
                                break;
                            case 1: // lb
                                convRatioInput = 0.45359243;
                                break;
                            case 2: // 貫
                                convRatioInput = 3.75;
                                break;
                        }
                    }
                }
                // アイテムが選択されなかった
                public void onNothingSelected(AdapterView<?> parent) {
                }
            });
            // 出力単位spinnerのアイテムセレクトリスナーを設定
            // リスナーを登録
            unitSpinnerOutput.setOnItemSelectedListener(new OnItemSelectedListener() {
                // アイテムが選択された時
                public void onItemSelected(AdapterView<?> parent, View viw, int arg2, long arg3) {
                    int idx = unitSpinnerOutput.getSelectedItemPosition();
                    if (categoryNumber==0) {    // 長さ
                        switch(idx){
                            case 0: // m
                                convRatioOutput = 1.0;
                                break;
                            case 1: // km
                                convRatioOutput = 1000.0;
                                break;
                            case 2: // mile
                                convRatioOutput = 1609.334;
                                break;
                        }
                    }else if(categoryNumber==1){    // 面積
                        switch(idx){
                            case 0: // m2
                                convRatioOutput = 1.0;
                                break;
                            case 1: // a
                                convRatioOutput = 100.0;
                                break;
                            case 2: // ha
                                convRatioOutput  = 10000.0;
                                break;
                        }
                    }else if(categoryNumber==2){    // 体積
                        switch(idx){
                            case 0: // m3
                                convRatioOutput = 1.0;
                                break;
                            case 1: // cc
                                convRatioOutput = 0.000001;
                                break;
                            case 2: // L
                                convRatioOutput = 0.001;
                                break;
                        }
                    }else if(categoryNumber==3){    // 重さ
                        switch (idx) {
                            case 0: // kg
                                convRatioOutput = 1.0;
                                break;
                            case 1: // lb
                                convRatioOutput = 0.45359243;
                                break;
                            case 2: // 貫
                                convRatioOutput = 3.75;
                                break;
                        }
                    }
                }
                // アイテムが選択されなかった
                public void onNothingSelected(AdapterView<?> parent) {
                }
            });
            // カテゴリーspinnerのアイテムセレクトリスナーを設定
            // リスナーを登録
            categorySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
                // アイテムが選択された時
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    categoryNumber = categorySpinner.getSelectedItemPosition();
                    switch (categoryNumber) {
                        case 0: // 長さ
                            unitList = getResources().getStringArray(R.array.unitListLength);
                            break;
                        case 1: // 面積
                            unitList = getResources().getStringArray(R.array.unitListArea);
                            break;
                        case 2: // 体積
                            unitList = getResources().getStringArray(R.array.unitListVolume);
                            break;
                        case 3: // 重さ
                            unitList = getResources().getStringArray(R.array.unitListWeight);
                            break;
                    }
                    adapter = new ArrayAdapter(getApplicationContext(),android.R.layout.simple_spinner_item, unitList);
                    unitSpinnerInput.setAdapter(adapter);
                    unitSpinnerOutput.setAdapter(adapter);
                    convRatioInput = 1.0;
                    convRatioOutput = 1.0;
                }
                // アイテムが選択されなかったとき
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                }
            });
        }
    }
    

    ではまた変わったところを説明していきます。

    まずはインポート部、5行目、ArrayAdapterのインポートが追加になっています。これはあとで単位スピナーのアイテムを入れ替えるときに使います。

    続いて変数の宣言部、20行目、カテゴリースピナーのインデックス用の変数が追加してあります。
    22行目に追加になっているのは、単位スピナー用の配列を一旦受け取るための配列です。
    23行目にはカテゴリースピナーのインスタンス用変数が、26行目には先ほどのArrayAdapterの変数が宣言してあります。

    34行目では、カテゴリースピナーのインスタンスを取得しています。

    57〜114行は、入力用単位スピナーのアイテムに対応して変換係数をセットするところです。カテゴリースピナーのインデックスを保存しているcategoryNumberの値に応じて、セットする係数セットを切り替えるようにしています。
    117〜174行目は今度は出力用単位スピナーの変換係数設定部です。変換係数の変数名が違うだけで後は入力単位スピナー用のブロックと全く同じです。

    そして今回新たに作ったのが、177〜206行目の、カテゴリースピナーを切り替えると同時に単位スピナーのセットも切り替える処理のリスナーです。
    まず181行目で、カテゴリースピナーのインデックスを取得します。
    そして、182〜195行目で、このインデックスに応じて、リソースからString-Arrayに設定した単位スピナー用の表示文字列セットを取り出します。
    続いて196行目でこの配列をアダプターにセット、197〜198行目で単位スピナーにこのアダプターをセットします。
    併せて199〜200行目で入出力の変換係数をリセットしています。ここで常に1でリセットすればいいように、変換の基準となる単位を単位スピナーの先頭にもってきてあるのです。

    以上で、目的の機能の実装が完了しました。
    あとは、世の中にある単位を気のすむだけ追加してやれば完成です。
    ひとまず完成です。



    でもちょっと気になるところがあるんですよね・・・



    機能はいいんですが、表示が。
    今回m2とかm3とかの単位が出てきたんですが、これ数字をちゃんと上付きにできないかなぁ・・・と思って。



    うーん、ちょっと調べてみますね。
    ではまた近いうちに。

     


    コメント
    コメントする








       

    calendar

    S M T W T F S
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    << November 2019 >>

    アクセスカウンタ

    合計:
    今日:
    昨日:

    selected entries

    categories

    archives

    recent comment

    • ホームページをリニューアルするの巻(19)−Googleウェブサイト翻訳ツールを組み込む
      てちくん
    • ホームページをリニューアルするの巻(19)−Googleウェブサイト翻訳ツールを組み込む
      てちくん
    • ホームページをリニューアルするの巻(19)−Googleウェブサイト翻訳ツールを組み込む
      小田きく江
    • ロリポブログでGoogleにサイトマップを登録する際の注意事項
      てちくん
    • ロリポブログでGoogleにサイトマップを登録する際の注意事項
      suraugi
    • いそべぇのペーパークラフトを作る(初級編)(12)
      てちくん
    • いそべぇのペーパークラフトを作る(初級編)(12)
      だべえ
    • noomでマイナス12kgのダイエットに成功!
      Yoko

    recommend

    recommend

    recommend

    ドール デザートメーカー ヨナナス901
    ドール デザートメーカー ヨナナス901 (JUGEMレビュー »)

    結構高いんです、でも欲しいんです!

    links

    profile

    書いた記事数:173
    最近の更新日:2017/01/30

    search this site.

    others

    mobile

    qrcode

    powered

    無料ブログ作成サービス JUGEM

    Google Adsense

    楽天ブックス

    楽天