常に新しい端末に適応する
指定できるリソース修飾子
前回は、端末における画面以外の特性に修飾子を付けることによって、それらの特性に応じてリソースを自動的に切り替えるという方法を解説しました。
最終回の今回は、前回のおさらいを兼ねて、リソースに指定可能な修飾子の一覧を示すとともに、リソース・マネージャが参照する端末の特性をコード側から取得する方法を示します。
最後に、リソース関連以外で重要なポイントとして、端末に搭載されているセンサー・デバイスを確認する方法や、状況に応じて最適な位置情報取得元(ロケーション・プロバイダ)を選択する方法について解説します。
これまで、リソースにさまざまな修飾子を付けてきましたが、あらためて、指定可能な修飾子を一覧すると、次の表(図1)のようになります。
図1: 指定できるリソース修飾子(クリックで拡大) |
これらの修飾子を複数指定する場合は、表の上から下の順番で指定します。例えば、言語と地域(ja-JP)を指定して、画面の向き(port、land)を指定するのは良いのですが、その逆の場合はエラーになります。
修飾子を付けないリソース・ディレクトリ(layout、valuesなど)がデフォルトとなるので、もっとも問題の起こりにくい構成(例えば、wrap_contentとfill_parentのみでレイアウトを構成するなど)にしておけば良いでしょう。
端末の特性をコードから取得する
これまではリソース・マネージャの仕組みを使って端末に対応してきましたが、アプリケーションのソース・コードからも端末固有の値を知りたい、という需要もあります。
ここでは、コードからどのようにして端末の設定情報を取得するかについて説明します。
解説のためにサンプルを用意したので、こちらからダウンロードしてください。ファイルはzipで圧縮してあり、展開するとEclipseのプロジェクトになります。Androidの開発プラグインをインストールしたEclipseにインポートしてください。
サンプル「ResourceTest3」プロジェクトのsrc配下は、コードを格納しているディレクトリです。また、res配下が、リソースを格納しているディレクトリです。
プロジェクトを実行すると、設定の一覧画面が表示されます。左はHT-03Aの端末設定の一覧、右はXperiaの端末設定の一覧です。
図2: 端末(HT-03AとXperia)の設定をコードから取得して一覧表示(クリックで拡大) |
サンプル・コード「MainActivity.java」を見てみましょう。
<code> @Override <font color="red">protected void</font> onCreate(Bundle savedInstanceState) { <font color="red">super</font>.onCreate(savedInstanceState); setContentView(R.layout.<font color="blue">main</font>); Resources r = getResources(); DisplayMetrics metrics = r.getDisplayMetrics(); String metricsStr = metrics2str(metrics); Configuration conf = r.getConfiguration(); String confStr = conf2str(conf); ((TextView)findViewById(R.id.<font color="blue">text_view</font>)).setText( metricsStr + <font color="blue">"\n"</font> + confStr ); } </code>
端末のディスプレイに関する値は、Resourceオブジェクトに含まれるDisplayMetricsオブジェクトを使って取得します。
MainActivityでは、onCreateのgetResources()によって、いったんResourcesオブジェクトを取得して、その後DisplayMetricsオブジェクトを取得しています。
また、端末固有の値は、Configurationオブジェクトを使って取得します。ConfigurationオブジェクトもResourcesオブジェクトに含まれます。
metrics2strメソッドはDisplayMetricsオブジェクトを、conf2strメソッドはConfiguratoinオブジェクトを、それぞれ文字列に変換しています。
DisplayMetricsから取得する値は、すべてピクセル数やdensityの数値です。一方、Configurationから取得する値は、地域や言語のような情報を除いて、すべてint型やfloat型の数値です。
Configurationについては、1つの値に複数の値が格納されていて、取り出すためにビット演算が必要になる個所があります。
これは、将来新しい選択肢が追加されたときに、フレームワークの変更を最小限にして、対応できるようにするためと思われます。
このように、リソース・マネージャが見ている値を、必要があれば、コード上から参照することができます。
次のページでは、センサーや位置情報の取得に関して、複数端末間の差異をどのように吸収するかについて見ていきましょう。