飴屋

Androidアプリ/日記6

文字列を定義してみよう

前回の日記で画面のレイアウトリソースを編集しながら、画面上で使用されるボタンのキャプションや入力欄のヒントなどの文字列はどのように定義していこうか悩んだので、その顛末をメモすることにします。

別段、自分向けのアプリなので、レイアウト定義XMLファイルの中に日本語でそのまま文字列を書きこんでおけばそれで事足りてしまうのですが、まぁ、せっかく日記に文章をおこしながらアプリを作るのだし、Androidマーケットに登録するところまでやってみたい気持ちもあります。となると他のユーザを意識したアプリの作りにしておいた方がよさそうです。androidマーケットのユーザ層はもちろん日本人に限られるわけではありませんので、いろいろな言語に対応していればそれだけ多くの人の目にも留まりそうです。しかし、何カ国語も自在に操る能力はありませんのでとりあえず「英語」と「日本語」のバイリンガルを目指すところから始めたいと思います。

それに関連して、体重管理アプリの場合、他国の体重を表す単位についても考慮しないとならないのですが、その辺は余裕があったら対応という形にしたいです。ポンドとかストーンとか斤とか各国で結構バラバラなようです。数値入力欄とも合わせて仕様を考えていかないといけない部分ですね。

res/values/strings.xml

文字列の定義は、Androidプロジェクトを作成した際に自動的に「res/values/strings.xml」というファイルができていましたので、そこに定義を追加していきます。eclipse上で、ファイル編集用のGUIが使えるので、「Add...」ボタンを押して要素を追加していきます。体重入力フォーム画面のボタンのキャプションを追加したときの手順は以下の通りです。

  1. Resources Elements(定義一覧)より「Add...」ボタンをクリック
  2. 追加するElementの種別「String」(文字列)を選択して「OK」ボタンをクリック
  3. 一覧に追加されたString要素を選択
  4. 右側のAttributes for欄でName(名前)とValue(値)を入力。名前はString定義を識別するためにつけるもので、値は実際に表示する文字列です。

こうやって作業を進めているとeclipse上での編集作業のクセにだんだん慣れてきました。とりあえず項目を追加して、後から詳細を埋めていくという編集作法なんですね。eclipseの作法なのか、android開発用のプラグインの作法なのかわかりませんが、XMLの編集方法として理にかなってますね。

なお、res/values/strings.xml上では「英語圏」のユーザ向けに文字列を定義しています。続いて、日本語用の定義ファイルを作成してみたいと思います。

多言語化

eclipseのPackageエリアから「res/values」ディレクトリを右クリックして、「New」→「Android XML File」とすると、追加項目に「Values」が選択された状態でファイルを追加するダイアログが出てきました。文字列の定義ファイルを追加するので、ファイル名には「strings.xml」を指定し、保存フォルダには「日本語」を示す接尾辞を追加します。「Language」というのが言語区分のことだと思われますので、Available Qualifiersの欄からChosen Qualifiersの欄にLanguageを移動します。移動したLanguageを選択すると日本語を表わす2文字のレターコードの入力を求められますので、「ja」と入力して「OK」ボタンを押します。

これでファイルの追加は終わりましたが、追加されたファイルは空っぽです。そこで英語用のstrings.xmlファイルのソースをごっそりコピーしてみました。これで後は各項目のValue(値)を日本語に変更するだけとなりました。
今のところ、使用する文字列は少ないのでいいのですが、これが大量の文字列を扱うアプリだったら、文字列定義の編集作業の方法についてよくよく考えた方がよさそうです。結構面倒くさい作業ですもんね。多言語リソース編集用のGUIとか誰か作ってるかもしれません。

レイアウト内で定義された文字列を読み込む

ボタンのキャプション用に文字列を二言語分定義しましたので、これをres/layout/input.xmlファイルの中で使用してみます。

<string name="buttonLog">Log</string>

こんな風に定義された文字列は、

<Button android:text="@string/buttonLog"></Button>

こんな風に指定してあげると適用されます。定義された「name」で表示対象を特定するのですね。英語と日本語の定義のどちらが使われるかは、Android端末の言語の設定に依存します。自分の端末は日本語を使うように設定してありますが、それ以外の言語に設定されている場合は英語がでるようになっています。

プログラム中で定義された文字列を読み込む

プログラムの中でも定義文字列を利用したい場面は度々あると思います。そんな場合は、

R.string.buttonLog

といった感じでRクラスを参照するといいようです。Rクラスは自動的に生成されるリソースを扱うクラスですね。

次回は、Androidエミュレータを使ってこれまでの成果物を確認してみたいと思います。

日記一覧