Comment définir une étiquette différente pour le lanceur plutôt que le titre de l'activité?

269

Cette question a déjà été posée - mais sans réponse satisfaisante! Je réessaye donc.

Je souhaite donner à l'icône du lanceur d'applications (celle qui s'affiche sur l'écran de démarrage!) Une légende différente et plus courte. Il semble que le lanceur tire son étiquette de la section mainfest sur l'étiquette de l'activité principale, comme ici:

<activity android:name="MainActivity" android:label="@string/app_short_name">
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

J'ai déjà changé la référence d'origine au nom de mon application @ string / app_name en une ressource de chaîne différente et plus courte ici.

MAIS - grand MAIS : cela change aussi bien sûr le titre par défaut de cette activité! Et je ne voulais pas que cela se produise, il y a assez d'espace pour un long nom d'application! Définir à nouveau le titre long en onCreateutilisant la setTitle(int)méthode ne sert à rien non plus, car le nom court sera visible pour l'utilisateur pendant une courte période, mais suffisamment longtemps pour le remarquer!

Et - s'il vous plaît ne répondez pas à ma question en vous référant à une barre de titre personnalisée ... Je ne veux pas aller aussi loin, juste à cause d'un titre de chaîne stupide! C'est pénible de dessiner une barre de titre personnalisée pour si peu d'effet!

N'y a-t-il pas un moyen simple de donner au lanceur une chaîne différente à afficher? Merci pour vos réponses!

Edit: Une autre raison pour laquelle avoir une barre de titre personnalisée est un problème est qu'elle ne ressemblera pas à la barre de titre par défaut, je devrais explicitement faire les choses pour qu'elle se ressemble sur chaque appareil! Et cela ne peut pas être une solution si, après tout, je ne veux pas d'une apparence différente!

Zordid
la source

Réponses:

470

Apparemment, <intent-filter>peut avoir un attribut label. S'il est absent, l'étiquette est héritée du composant parent (activité ou application). Donc, en utilisant cela, vous pouvez définir une étiquette pour l'icône du lanceur, tout en ayant l'activité avec son propre titre.

Notez que, bien que cela fonctionne sur les émulateurs, cela peut ne pas fonctionner sur les vrais appareils, car cela dépend de l'implémentation du lanceur utilisée.

http://developer.android.com/guide/topics/manifest/intent-filter-element.html

<activity
  android:name=".ui.HomeActivity"
  android:label="@string/title_home_activity"
  android:icon="@drawable/icon">
  <intent-filter android:label="@string/app_name">
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

Note latérale: <intent-filter> peut également avoir un attribut d'icône, mais inexplicablement, il ne remplace pas l'icône spécifiée dans l'activité. Cela peut être important pour vous si vous prévoyez d'utiliser l'ActionBar native dans le SDK 11+, qui utilise l'icône et le logo spécifiés sur l'activité.

Informations ajoutées: l'étiquette est héritée de l'activité et non de l'application.

 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"       
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name=".StartActivity"
            android:label="@string/app_long_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Dans ce cas, app_long_name sera affiché avec l'icône du lanceur, si nous ne mettons pas d'étiquette à l'intérieur comme mentionné ci-dessus.

Mark Renouf
la source
5
C'est génial !! Je vais l'essayer ce soir. Wow, pourquoi une telle chose n'est-elle pas correctement documentée ?? !! Je sais pourquoi je n'aime pas ces structures XML étranges ... ;-)
Zordid
13
Oh non, oh non. Déçu maintenant. Les lanceurs Android purs (sur les émulateurs!) Font vraiment ce dont nous avons discuté ici, mais par exemple, le lanceur de HTC ignore l'étiquette d'étiquette de l'intention. :-( C'est stupide! Asus Eee Pad avec Honeycomb n'adhère PAS non plus à cette étiquette.
Zordid
2
Donc, ce que vous voyez, c'est l'étiquette d'activité? C'est une honte. Je m'attendais à moitié à ce que, comme cela n'est pas documenté, quiconque écrit un lanceur n'implémenterait probablement pas le comportement correct.
Mark Renouf
12
Fonctionne sur mon Gingerbread Nexus One, Nexus S ainsi que sur les versions "plus récentes" :-) Mais malheureusement, mec à l'incohérence, je recommanderais de ne pas l'utiliser. Je suis également enclin à mettre à jour la réponse avec un avertissement.
Mark Renouf
3
Je n'ai aucune idée pourquoi diable cela a autant de votes positifs. Les gens ne testent-ils pas leur code sur un vrai appareil avant de supposer que quelque chose fonctionne? Cette solution, comme indiqué par d'autres, ne fonctionne PAS sur un appareil réel. J'ai testé sur 4 appareils (vanille et non vanille Android) et rien. Cela ne fonctionne que sur l'émulateur. La seule façon que j'ai trouvée était d'utiliser setTitle comme décrit dans la réponse d'Anila.
Tiago
35

Je cherchais la même chose et voici ce qui a fonctionné pour moi.

<activity android:name="MainActivity" android:label="@string/app_short_name">
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Cela donnera un nom court à l'icône de votre lanceur d'application.

Pour ajouter un nom plus grand à la barre d'application, il vous suffit d'ajouter:

this.setTitle(getResources().getString(R.string.app_name));

dans votre fichier java d'activité principal.

Anila
la source
Cela fonctionne sans faute si vous devez changer le titre de votre activité de lanceur. Cependant, il fait clignoter le nom de l'icône pendant environ 1 seconde.
rphello101
2
Si cela ne vous dérange pas que votre application affiche brièvement une barre d'action vide (c'est-à-dire aucun titre du tout), vous pouvez modifier votre style de barre d'action et supprimer showTitlede la displayOptions. Vous pouvez ensuite activer le titre dans l'activité onCreatecomme ceci: this.getActionBar (). SetDisplayOptions (ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); C'est mieux que le nom de l'icône clignotant, mais cela signifie que chaque activité de votre application devra activer le titre si elle le requiert.
BruceHill
Cela fonctionne sans faute si vous devez changer le titre de votre activité de lanceur.
Pourquoi ne pas setTitle(R.string.app_name);?
arekolek
10

La solution de Mark Renouf échoue (en utilisant Nexus 4 et Android 4.4). Il échoue lors de l'utilisation de raccourcis, les raccourcis utilisent l'étiquette d'activité principale au lieu du nom de l'application. J'ai vu des applications comme GMail et Google Keep qui fonctionnent bien. Mais lorsque vous les ouvrez, je remarque que son comme un moment entre le titre est vide et le titre apparaît (ce qui semble mieux que le nom de l'application clignotant avant de définir le titre à l'aide de setTitle ()).

Voici donc la meilleure solution que j'ai trouvée :

Créez un style dans lequel l'ActionBar n'affiche pas le titre / l'étiquette:

<style name="NoActionBarTitle" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/NoActionBarTitle.ActionBar</item>
</style>

<style name="NoActionBarTitle.ActionBar" parent="@android:style/Widget.Holo.ActionBar">
    <item name="android:displayOptions">showHome|useLogo</item>
</style>

J'utilise un tiroir de navigation et un logo (car j'utilise un logo et une icône pour mon application). Vous pouvez utiliser n'importe quoi mais n'utilisez pas showTitle . Ensuite, dans AndroidManifest.xml, définissez le thème de MainActivity:

<activity
    android:name="com.xx.xxx.MainActivity"
    android:logo="@drawable/ic_icon_padding"
    android:theme="@style/NoActionBarTitle">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Ensuite, dans la méthode onCreate () de MainActivity, définissez le titre de votre barre d'actions:

getActionBar().setTitle(R.string.your_title);

Après cela , vous pouvez appeler:

getActionBar().setDisplayShowTitleEnabled(true);

Délicat mais ça vaut le coup.

Ferran Negre
la source
4

Cela ne satisfera probablement pas ce que vous voulez faire, mais avez-vous pensé à créer un écran de démarrage qui s'affiche très brièvement (avec le titre par défaut), puis lance votre nouvelle activité "principale" réelle avec le titre de votre choix en utilisant la setTitle(int)méthode ? Je n'ai pas essayé cela pour voir si cela fonctionne, mais cela pourrait créer un travail agréable qui ne montre pas la nature moins que transparente de ce que vous essayez de réaliser.

Adriaan
la source
2

Pour toute personne utilisant Support / Appcompat Toolbar via la setSupportActionBar()méthode, le titre de l'activité peut être défini dans Toolbar XML:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    app:title="@string/activity_title"
    ...
/>

Cela remplacera les étiquettes d'application et d'activité définies dans le manifeste.

android.support.v7.widget.Toolbar

Maksim Ivanov
la source
1

J'ai trouvé une solution de contournement à ce problème

dans manifest.xml

Écrivez le nom de votre application dans l'activité android:labeldu lanceur (principal) .

Cela rendra l'étiquette de votre activité principale identique à celle de l'étiquette de l'application.

Ensuite, dans la onCreate()fonction de votre activité Launcher (principale), écrivez cette déclaration

if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle("main activity label");
        }

Écrivez ici l'étiquette que vous souhaitez donner à votre activité Launcher (principale).

Tanuj Yadav
la source
0

Vous pouvez faire quelque chose comme ça:

public class FooBar extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // change title
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.main);
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_title);
    }
}

Vous devrez créer une mise en page personnalisée pour contenir le titre. Cela pourrait être aussi simple que (appelé my_title.xmldans ce cas):

<?xml version="1.0" encoding="utf-8"?>
<TextView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="foo bar"/>

Dans votre AndroidManifest.xmlfichier, il vous suffit de définir le titre de l'application, qui sera affiché dans l'icône du lanceur. Pour votre activité, vous n'avez pas besoin de définir un titre ici.

Cristian
la source
1
Je doute que ce soit vraiment vrai: le libellé de l'application n'est pas ce qui définit le libellé du lanceur - il définit simplement le nom de l'application dans la liste des applications installées (paramètres-> applications-> gérer les applications) et ce libellé est également pris par Android Marché aussi. Je ne veux donc pas changer cela. En expérimentant, j'ai découvert que c'est aussi le titre de l'activité que le lanceur prend. En dehors de cela: votre solution implique un titre simple que je ne veux pas! Cela ne ressemble jamais du tout à la barre de titre par défaut - ou je devrais faire beaucoup pour avoir un comportement par défaut - pas bon du tout!
Zordid
Hmm ... c'est encore pire. Je viens d'essayer votre solution. Mais, la barre de titre ne ressemble pas du tout à la valeur par défaut et, pire encore, la barre de titre par défaut (indiquant le nom court que je ne veux pas voir) s'affiche peu de temps avant que la barre de titre personnalisée n'apparaisse. Ainsi: cette solution est identique à la simple définition du titre à l'aide de setTitle. :-(
Zordid
0

Le lanceur affiche en fait android: label et android: icon for activity (s) that declare

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

l'étiquette d'application n'est donc d'aucune utilité.

Rahul
la source