2011-06-19 遅刻してごめんなさい

_ Sony Ericsson "LiveView Ideathon 2011" に参加しました。

To Be Written.

_ 画面サイズの判定方法

@95kugo さん、@itog さんと呑んでいる時に、画面サイズの判別(small, normal, large, xlarge)ってアプリからできるっけ?という話になったので、やり方のメモです。このやり方は iosched という Google I/0 参加者用のスケジュール管理アプリでみつけました。余談ですが、iosched という名前は kernel の中で入出力を管理しているプログラムとしか思えないのですが狙ってるのでしょうか...

判定コード

以下のように、android.content.res パッケージに属しているConfiguration クラスを使用して端末の画面サイズを判定可能です。

(context.getResources().getConfiguration().screenLayout
                & Configuration.SCREENLAYOUT_SIZE_MASK)
                == Configuration.SCREENLAYOUT_SIZE_XLARGE

このコードが true を返せば xlarge です。画面サイズ毎に処理を分岐したい場合は == の前の値を switch 文で分岐させればOK。

画面サイズの判定のために、Configuration クラスには以下の定数が定義されています。

API Levelとの関係

API Level 3(Android 1.5)以下

Configuration クラスに screenLayout が定義されていないので、スクリーンサイズの判定はできません。 API Level 3 の端末に対応する必要がある場合は、 API バージョンをチェックした上で small 決め打ちでよいと思います。

追記: @marchuq さんに教えてもらったのですが、こんな 1.5 端末もあるのですね... 少なくとも 1.5 だから small というのは正確ではないようです。 Build クラスの値から振り分けるなど、いくつかの方法を組み合わせる必要がありそうです。

API Level 3(Android 1.6)以上8(Android 2.2)以下

Configuration クラスのメンバ変数である screenLayout や、判定のための定数の大部分は API Level 4 で定義されていますが、唯一 SCREENLAYOUT_SIZE_XLARGE だけは定義されていません。

API Level 8 以下で xlarge の判別を行いたい場合は、独自に xlarge のための定数(値は 4)を定義するか、default.properties で API Level 9 以上を指定して SCREENLAYOUT_SIZE_XLARGE が定義されている android.jar を使用する必要があります。後者の場合は、API Level 9 の情報を使用することになりますが、 Java の仕様上定数はコンパイル時にインライン展開されるので API Level が 9未満の端末でも未定義エラーになることはありません。

API Level 9(Android 2.3)以上

SCREENLAYOUT_SIZE_XLARGE を含め、全て使用することができます。


«前の日記(2011-06-16) 最新