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

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

    前回お約束しました通り、スピナーのアイテムで上付き文字を使用する方法について調べてきました。
    まず、レイアウトで設定したままのスピナーであれば、strings.xmlに定義してあるstring-arrayで次のように書けば上付き文字を表示させることができます。
        <string-array name="category">
            <item>長さ<sup><small>2</small></sup></item>
            <item>面積</item>
            <item>体積</item>
            <item>重さ</item>
        </string-array>
    

    出力結果はこうなります。


    割とあっさりできました。
    参考にさせて頂いたのはこちらのサイトです。

    - Google Android - 雑記帳:Tips TextView を使いこなそう 〜 表示編 〜 その2

    その他の使用可能なタグ一覧も載っていますので、参考になると思います。


    しかし、この方法、途中で中身を切り替えられるようにした単位用スピナーではうまくいかないようです。
    コードはこうなっていました。
    String[] unitList;
    (中略)
    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);
    
    単位リストを入れる配列「unitList」を冒頭で「String[]」で宣言していますが、これは6,9,12,15行目のgetResources().getStringArrayがstring[]しか受け付けてくれないためです。htmlタグ付きのStringはただのStringではなく「CharSequence」と呼ばれるものになるので、このやり方では通らなかったということでした。

    対応策はいくつかあるようですが、私がやってみてうまくいったのは、unitListをCharSequenceのArrayListとして宣言してやり、そこにその場で一行ずつ足していってやる方法です。
    実際にコードを見てもらった方が早いでしょう。
    @Override
    public void onItemSelected(AdapterView parent, View view, int position, long id) {
    categoryNumber = categorySpinner.getSelectedItemPosition();
    unitList  = new ArrayList<>();
    switch (categoryNumber) {
    case 0: // 長さ
    unitList.add("m");
    unitList.add("km");
    unitList.add("mile");
    break;
    case 1: // 面積
    unitList.add(Html.fromHtml("m<sup><small>2</small></sup>"));
    unitList.add("a");
    unitList.add("ha");
    break;
    case 2: // 体積
    unitList.add(Html.fromHtml("m<sup><small>3</small></sup>"));
    unitList.add("cc");
    unitList.add("L");
    break;
    case 3: // 重さ
    unitList.add("kg");
    unitList.add("lb");
    unitList.add("貫");
    break;
    }
    adapter = new ArrayAdapter(getApplicationContext(),R.layout.spinner_item, unitList);
    unitSpinnerInput.setAdapter(adapter);
    unitSpinnerOutput.setAdapter(adapter);
    convRatioInput = 1.0;
    convRatioOutput = 1.0;
    }
    
    ポイントは4行目でunitListを確保し、12行目と17行目でHtml.fromHtml()メソッドでタグを記入しているところです。こうしてやることで、切り替えたスピナーでも上付き文字を表示することができました。


    めでたしめでたし・・・・と思っていたら、何やら緊急事態が発生しました。

    単位スピナーの文字が表示されなくなってしまったのです!
    いや、よくよく見ると文字は書かれてはいるのですが色が真っ白になってしまって、全く見えない状態でした。
    そんな設定は何一ついじっていないので、今回ばかりは原因がわかりません。(もしかしたらSDKをアップデートしたせい・・・?)

    判らないと言っていては始まらないので、ここは強制的にスピナーの文字の色を指定しやることにしましょう。

    最初に試したのは、style.xmlのなかで、新しくandroid:spinnerItemStyleとandroid:spinnerDropDownItemStyleを定義しなおしてやることです。こんな感じに書いてやります。
     
    <resources>
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
            <item name="android:spinnerItemStyle">@style/SpinnerItemStyle</item>
            <item name="android:spinnerDropDownItemStyle">@style/SpinnerDropDownItemStyle</item>
        </style>
        <style name="SpinnerItemStyle" parent="android:Widget.Holo.Light.TextView.SpinnerItem">
            <item name="android:textSize">24sp</item>
            <item name="android:textColor">#000000</item>
        </style>
        <style name="SpinnerDropDownItemStyle" parent="android:Widget.Holo.Light.DropDownItem">
            <item name="android:textSize">24sp</item>
            <item name="android:textColor">#000000</item>
        </style>
    </resources>
    

    8,9行目で新たなスタイルを呼び出しています。11行目からがその新しいスタイルになっています。
    これはこちらのサイトを参考にさせていただきました。
    Y.A.M の 雑記帳:Android Spinnerの選択肢をXMLで指定する

    でもこれ実際にやってみたら、カテゴリースピナーには効くのですが、単位スピナーに効いてくれません・・・
    仕方がないので次の手を。

    先ほどのコードでArrayAdapterをセットする部分、こうなっていました。
    adapter = new ArrayAdapter(getApplicationContext(),R.layout.spinner_item, unitList);
    

    これ、前回のコードでは、
    adapter = new ArrayAdapter(getApplicationContext(),android.R.layout.simple_spinner_item, unitList);
    

    こうなっていたのです。前回のコードではデフォルトのレイアウトである「android.R.layout.simple_spinner_item」が呼ばれている部分が「R.Layout.spinner_item」に書き換わっています。これは自作のレイアウトファイルを呼び出すようにしているのです。

    自作のレイアウトファイルの中身はこうなっています。
    <?xml version="1.0" encoding="utf-8"?>
    <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:gravity="left"
        android:textColor="#000000"
        android:padding="5dp"
        />
    
    こんな形に、文字サイズと文字色、パディング等を指定しています。
    これで無事全部丸くおさまりました。

    できあがりはこんな感じです。


    いいんじゃないでしょうか☆?
    特に触れませんでしたが、今回実機でもデバッグしてやったところ、スピナーの縦の幅が狭くてタップしにくいということが判りましたので、今回はwrap_contentではなく高さを直接指定して、少し幅を広げてやっています。

    あとは変換できる単位とカテゴリーを充実させてやるだけです。

    次回は最終結果をお見せするつもりです。お楽しみに。


    コメント
    コメントする








       

    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

    楽天ブックス

    楽天