2015年11月26日
Androidのアプリは、ホーム画面からランチャー(アプリ一覧画面)を呼び出すことで起動できるのですが、ランチャーに表示されるアイコンの下につくテキスト(通常はアプリの名前を示す)が、同じアプリであってもAndroidのバージョンにより変化してしまう場合があるようです。
ホーム画面下に並んでいる真ん中のアイコンをタップするとランチャーが表示される
Androidでは、アプリやアクティビティーにラベルをつけて、テキストとして表示できます。
設定は、AndroidManifest.xmlの中で行います。
例えば、Android 4.4.2やAndroid 6.0では、AndroidManifest.xmlとres/string.xmlが(部分的に)以下のようになっているとします。
AndroidManifest.xmlの一部 |
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:label="@string/title_activity_main" android:name=".MainActivity" > <intent-filter android:label="@string/icon_name"> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".LoadActivity" android:label="@string/title_activity_load"></activity> <activity android:name=".SaveActivity" android:label="@string/title_activity_save"></activity> </application> |
string.xmlの一部 |
<string name="app_name">Test205</string> <string name="icon_name">Test205起動アイコン名</string> <string name="title_activity_main">Test205メイン画面</string> |
上記の設定では、以下のように意図しています。
設定している場所 | 設定の内容 | 設定値 |
---|---|---|
applicationタグのandroid:label | アプリケーションの名前 | Test205 |
アプリで最初に起動するactivityを起動するためのintent-filterのandroid:label | ランチャーに登録されるアプリ起動アイコンのタイトル | Test205起動アイコン名 |
アプリで最初に起動するactivityのandroid:label | 初期起動するアクティビティーのタイトル | Test205メイン画面 |
Android4.4.2では、設定した各種名称は、次のように表示されます。
設定アプリで「アプリ」一覧を表示したときに出るアプリ名
アプリをアンインストールするときなどに開く「設定」の画面で、「アプリ」を選ぶと、アプリ一覧が表示されます。そのときに表示されるアプリの名前を決めることができます。
基本的に、applicationタグの中で、android:labelに設定した値が表示されます。
ランチャーのアプリ一覧で、アプリのアイコンの下に出るテキスト
ホーム画面からランチャー(アプリ一覧)を開いて、アプリの一覧を表示したときに、各アプリのアイコンとともに、指定したテキストを表示できます。
Android 4.4.2では、アプリで最初に起動するactivityタグ内に作るintent-filterタグの中に、android:labelを作り、テキストをセットすると、そのテキストが表示されます。
アプリで最初に起動するアクティビティーの名前
最初に起動するアクティビティーのactivityタグ内に作る、android:labelで指定したテキストが、アプリを最初に起動したときに表示されるアクティビティーのタイトルとして、アクションバーに表示されます(標準的なレイアウトの場合)。
なお、activityタグにつけるlabelは、最初に起動するアクティビティー以外にも設定することができます。設定した場合は、各アクティビティーのラベルとして表示できます。
上記の挙動は、Android 6.0でも同様のようです。
Android 5.1.1が入った手持ちの実機(Nexus 7 2012年モデル)と、オフィシャルなエミュレータでは、上記のアプリで、ランチャーのアイコンに、先ほどとは違うテキスト「Test205メイン画面」が表示されます。
intent-filterでandroid:labelとして、「Test205起動アイコン名」というテキストを指定しているのに、反映されていません。
原因としては、intent-filter内のlabelが無視されていることが考えられます。AndroidManifest.xmlでは、intent-filterでラベルが設定されていない場合は、かわりにアクティビティーのラベルを表示する仕様になっています。このため、起動アイコンは「Test205メイン画面」と表示されてしまうようです。
このバグのような動作は、Android 5系列に固有のもののようです。Android 6.0では以下のように、intent-filterのandroid:labelが正しく評価され、ランチャーでは「Test205起動アイコン名」と表示されます(名前が長すぎて一部欠けていますが)。
Android 5.1に限り、intent-filterで指定したandroid:labelが無視されてしまう問題はともあれ、公式ではこの名前をどうつければよいとしているのでしょうか?
http://developer.android.com/guide/topics/manifest/manifest-intro.htmlを調べてみたところ、以下のAndroid 4.4.2や6.0に通用するルールが書いてありました。公式サイトは最新のAndroidに従うので、6.0の説明としては合っています。
iconとlabelの指定は、applicationやactivity、intent-filterのタグに設定できる。
appicationのタグに設定すると、アプリ全体のアイコンやラベルとなる。
activityのタグに設定すると、各アクティビティーのアイコンやラベルとなる。
intent-filterに設定すると、そのインテントが画面に現れるときに使われるアイコンやラベルになる。アプリをランチャーから起動させるためのintent-filterの指定であれば、ランチャーに表示されるアイコンやラベルとなる。
入れ子構造の内側でiconやlabelを指定しないと、外側で指定した内容で代用される。applicationで設定した内容は、activityやintent-filterで指定しないと、activityやintent-filterでも使われる。activityで指定した内容は、intent-filterで指定しないと、intent-filterでも使われる。
アプリを起動して最初に表示されるアクティビティーのラベルと、ランチャーでアプリを起動させるアイコンにつける名前が違っていると、Android 5.1では起動アイコンの名前を正しく表示できず、かわりに起動時のアクティビティー名がランチャーのアイコンに表示されてしまいます。
対策としては、例えばAndroidManifest.xmlの中では、初回起動のアクティビティーのラベルには、ランチャーで表示したいテキストを入れておき、そのアクティビティーが起動したら、ソースコードで、アクティビティーに表示するラベルを、本当に表示したいテキストに置き換えることなどが考えられます。
だけど、なんだか面倒です。とても基本的な機能なのに、なぜAndroid 5.1だけ違う挙動をするようにできているのか、謎です。
自分でアプリを作るときは、とりあえずは、ランチャーのアイコン名と、初回起動のアクティビティーのラベルは、同じ名前をつけるようにしています。
android:labelは、AndroidManifest.xmlのapplication, activity, intent-filterのタグ内で使用できる。それぞれ、アプリ名、アクティビティーのラベル、インテントが表示されるときのラベル(ランチャーのアイコンにつくラベル等)として扱われる。
Android 5.1では、intent-filterのlabelが無視される様子だ。Android 4.4.2や6.0では、そのような問題はない。
android:labelを一切指定しないと、設定アプリ内で表示されるアプリ名はアプリのパッケージ名(例:jp.sakura.sugi.test205)、ランチャーの起動アイコンのラベルと、アプリで最初に起動するアクティビティーのラベルは、アプリのパッケージ名+初回起動するアクティビティーのクラス名(例:jp.sakura.sugi.test205.MainActivity)となります。このような表示は、必ずしもユーザフレンドリーとは言えないでしょう。
杉原俊雄のホームページ→ Androidアプリ開発メモ(もくじ)
(c) 2015 Toshio Sugihara. All rights reserved.