web-dev-qa-db-fra.com

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

Cette question a déjà été posée - mais sans réponse satisfaisante du tout! Alors j'essaye encore.

Je souhaite attribuer à mon icône de lanceur d'application (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à remplacé la référence d'origine par le nom de mon application @ string/app_name par une autre ressource chaîne plus courte ici.

MAIS - grand MAIS: cela modifie 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 nom d'application long! Régler le titre long à nouveau dans onCreate en utilisant la méthode setTitle(int) ne sert à rien non plus, car le nom abrégé sera visible par l'utilisateur pendant un court instant, mais suffisamment long 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! Il est difficile de dessiner une barre de titre personnalisée pour un effet si limité!

Y at-il pas de moyen facile de simplement 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 pénible, c'est qu'elle ne ressemblera pas à la barre de titre par défaut. Il faudrait que je fasse explicitement les choses pour que toutes les unités soient identiques! Et cela ne peut pas être une solution si, après tout, je ne veux pas d'une apparence différente!

264
Zordid

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

Notez que, même si cela fonctionne sur les émulateurs, il se peut que cela ne fonctionne pas sur de vrais périphériques, car cela dépend de l'implémentation du programme de lancement 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>

Remarque latérale: <intent-filter> peut également avoir un attribut icon, 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 le ActionBar natif dans le SDK 11+, qui utilise les icônes et les logos spécifiés dans l'activité.

Informations ajoutées: Le libellé est hérité de Activity 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 l'étiquette à l'intérieur comme mentionné ci-dessus.

466
Mark Renouf

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’applications.

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

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

dans votre fichier d'activité principale Java.

35
Anila

La solution de Mark Renouf me fait défaut (avec Nexus 4 et Android 4.4). Il échoue lors de l'utilisation de raccourcis, ceux-ci utilisent l'étiquette d'activité principale au lieu du nom de l'application. J'ai vu des applications comme GMail et Google Keep fonctionner correctement. Mais lorsque vous les ouvrez, je remarque qu’il s’agit d’un laps de temps vide entre le titre et le titre (ce qui semble meilleur que le nom de l’application qui clignote avant de définir le titre à l’aide de setTitle ()).

Donc voici la meilleure solution que j'ai trouvée:

Créez un style où le ActionBar n'affiche pas le titre/libellé:

<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 le fichier 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’action:

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

Après cela, vous pouvez appeler:

getActionBar().setDisplayShowTitleEnabled(true);

Difficile mais vaut la peine.

10
Ferran Negre

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" avec le titre de votre choix à l'aide de la setTitle(int) méthode? Je n’ai pas essayé de voir si cela fonctionnait, mais cela pourrait créer un travail agréable qui ne montre pas la nature transparente de ce que vous essayez d’atteindre.

4
Adriaan

Pour ceux qui utilisent la barre d'outils Support/Appcompat via la méthode setSupportActionBar(), le titre de l'activité peut être défini dans XML de la barre d'outils:

<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

2
Maksim Ivanov

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

Dans manifest.xml

Ecrivez votre nom de l'application dans le Android:label de l'activité launcher (main).

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

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

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

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

1
Tanuj Yadav

Le lanceur affiche en effet Android: label et Android: icône pour la ou les activités qui déclarent

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

si l'étiquette d'application est d'aucune utilité.

0
Rahul

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.xml dans 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 fichier AndroidManifest.xml, il vous suffit de définir le titre de l'application, ce qui sera affiché dans l'icône du lanceur. Pour votre activité, vous n'avez pas besoin de définir un titre ici.

0
Cristian