Androidアプリの起動アイコンにつくテキストが、Android 4.4と5.1では違う表示になる場合がある

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では、設定した各種名称は、次のように表示されます。

上記の挙動は、Android 6.0でも同様のようです。

Android 5.1.1ではintent-filter内のlabelが無視される

Android 5.1.1が入った手持ちの実機(Nexus 7 2012年モデル)と、オフィシャルなエミュレータでは、上記のアプリで、ランチャーのアイコンに、先ほどとは違うテキスト「Test205メイン画面」が表示されます。

intent-filterでの指定を無視した起動アイコン名の表示

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の説明としては合っています。

対策をするとすれば

アプリを起動して最初に表示されるアクティビティーのラベルと、ランチャーでアプリを起動させるアイコンにつける名前が違っていると、Android 5.1では起動アイコンの名前を正しく表示できず、かわりに起動時のアクティビティー名がランチャーのアイコンに表示されてしまいます。

対策としては、例えばAndroidManifest.xmlの中では、初回起動のアクティビティーのラベルには、ランチャーで表示したいテキストを入れておき、そのアクティビティーが起動したら、ソースコードで、アクティビティーに表示するラベルを、本当に表示したいテキストに置き換えることなどが考えられます。

だけど、なんだか面倒です。とても基本的な機能なのに、なぜAndroid 5.1だけ違う挙動をするようにできているのか、謎です。

自分でアプリを作るときは、とりあえずは、ランチャーのアイコン名と、初回起動のアクティビティーのラベルは、同じ名前をつけるようにしています。

まとめ

ちなみに


杉原俊雄のホームページAndroidアプリ開発メモ(もくじ)

(c) 2015 Toshio Sugihara. All rights reserved.