Lesson2:Supporting Different Devices
Android端末は、いろんな形状やサイズのものが世界中で販売されてます。そのため、Android用に開発したアプリを世界中に広めたいなら、様々なデバイス構成をサポートする必要があります。その中でも、多言語のサポート、様々な画面構成のサポート、異なるAndroid OSのバージョンサポートの3つは、とくに重要です。
今回のレッスンでは、多様なデバイス構成に対する3つのサポートをアプリケーションの単体パッケージで実現する方法について解説します。
Device compatibility overview | Android Developers
多言語のサポート
異なる言語のサポート | Android Developers
これについては、下記メモを参照ください。
メモ:文字列の定義とアプリの国際化(テキストローカライズ)対応 - Mono Works
様々な画面構成のサポート
複数画面をサポートする | Android Developers
Android端末の画面構成は、画面サイズと密度という2つの要素で分類されます。この2つの要素に対応して、アプリの画面レイアウトを最適化させるには、選択可能なリソースを用意する必要があります。
画面サイズに合わせたレイアウトファイルの用意
これは、多言語サポートと同じように画面サイズごとにリソースフォルダを分けて、レイアウト用のXMLファイルを準備します。画面サイズは、small、normal、large、xlargeの4段階で、それぞれ下記のようなフォルダ構成でレイアウトファイルを用意します。
res/
layout-small/
main.xml
layout/
main.xml
layout-large/
main.xml
layout-xlarge/
main.xml
画面解像度に合わせた画像ファイルの用意
こちらは、下記メモを参照ください。
Android端末の画面構成は非常に多様で、そのサポートは一筋縄ではありません。ここでは、その一端を示しましたが、下記レッスンで別途解説しますので、また今度。
複数画面をサポートする | Android Developers
異なるAndroid OSのバージョンサポート
プラットフォームのバージョンとAPIのレベル
他のOS同様、Androidのプラットフォームもバージョンアップが繰り返されていて、それぞれのバージョンごとに(Build.VERSION_CODESクラスの定数として)固有のバージョンコードが割り振られています。
Build.VERSION_CODES | Android Developers
また、Androidプラットフォームが提供する framework APIは、プラットフォームのバージョンが上がるのに合わせて改訂(新機能の追加等)がおこなわれており、プラットフォームのバージョンとAPIレベルには相関があります。APIレベルとバージョンコードの関係は、下記ページにまとめられています。
<uses-sdk> | Android Developers
どこまで古いバージョンをサポートするか問題
Android開発者サイトでは、どのバージョンの端末がどれくらいの割合で稼働しているかという情報が公開されていて、定期的に更新されています。下記メモにバージョンのサポート範囲についてまとめているので、サポート範囲決定の参考にしてください。
メモ:Androidのバージョンや画面サイズの違いにどこまで対応するか - Mono Works
サポートするバージョンの範囲が決まったら、次は、どうやって、その範囲をカバーするのかというお話です。
バージョン(APIレベル)の指定
具体的には、開発しているアプリのテスト対象(ターゲット)となるバージョンと、サポート対象とする最も古いバージョンの 2つをAPIレベルで記述します。トレーニングページには、AndroidManifest.xmlファイルの <uses-sdk>要素内に記述するよう解説されてますが、Android Studioのテンプレートからプロジェクトを作成した場合、これらは build.gradleに記述されており、AndroidManifest.xmlファイルに記述しなくてもOKです。build.gradleとAPIレベルに関する説明は、下記トレーニングを参照ください。
Android開発者トレーニング(Lesson1)プロジェクトの作成など - Mono Works
システムバージョンの確認と活用方法
プラットフォームのバージョンは、下記の記述で取得できます。これで APIレベルを int型で取得できます。
Build.VERSION.SDK_INT
この取得値は、こんな風に活用できます。
if (Build.VERSION.SDK_INT >= 16) {
// ここにAPIレベル16以降の端末で実行する処理を記述
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
// ここにAPIレベル16以降の端末で実行する処理を記述
}
表現は違いますが、いずれも APIレベルが16(Android 4.1 JELLY_BEAN)以降の端末でのみ、実行させたい処理を記述する手段です。
なお、Androidでは、Android Support Libraryというツールが提供されています。このツールをアプリに組み込むことで、古いバージョンのプラットフォームでも、より新しいバージョンのAPIを利用可能にすることができます。詳しくは、こちら。
Support Library | Android Developers
また、Androidアプリでは、XML属性として記述された内容については、実行時のシステムでサポートされていない記述は無視されます。なので、古いシステムのことを気にせず、どんどん新しいバージョンでサポートされているXML属性を使っていきましょう。と書かれています。
スタイルとテーマを使う
Androidでは、デフォルトでいくつかのスタイルやテーマが提供されています。これらシステムに組み込まれたスタイルやテーマを使っておくと、新しいバージョンで提供されるスタイルやテーマが自動的に適用されます。これらスタイルやテーマは、manifestファイルに記述します。
アプリ全体(すべてのactivity)にandroidの提供するテーマを適用する場合、こんな記述になります。例では、Theme.Translucent(透明な背景)を適用。
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.co.monoworks.myfirstapp" >
<application
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent" ></br> <activity
...<中略>
</activity>
</application>
</manifest>
特定のactivity(例では、MyActivity)に「/res/values/styles.xml」で定義したオリジナルのテーマを適用する場合、このように記述します。
<activity
android:name=".MyActivity"
android:theme="@style/CustomTheme">
</activity>
というわけで、今回のレッスンでは、ざっくりと様々なAndroid端末に対応する方法についてトレーニングしました。
【参考サイト】
・Supporting Different Devices | Android Developers
・Supporting Different Languages | Android Developers
・Supporting Different Screens | Android Developers
・Supporting Different Platform Versions | Android Developers
コメント
コメントなどありましたら、GitHubのディスカッションへお願いします。(書き込みには、GitHubのアカウントが必要です)