Wie kann ich eine andere Bezeichnung für den Launcher als für den Aktivitätstitel festlegen?

269

Diese Frage wurde schon einmal gestellt - aber ohne befriedigende Antwort! Also versuche ich es noch einmal.

Ich möchte meinem Application Launcher-Symbol (das auf dem Startbildschirm angezeigt wird!) Eine andere, kürzere Beschriftung geben. Es scheint, dass der Launcher sein Etikett aus dem Hauptfestabschnitt über das Etikett der Hauptaktivität bezieht, wie hier:

<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>

Ich habe den ursprünglichen Verweis auf den Namen meiner App @ string / app_name bereits in eine andere, kürzere String-Ressource geändert.

ABER - groß ABER : Dies ändert natürlich auch den Standardtitel dieser Aktivität! Und ich wollte nicht, dass das passiert, es gibt genug Platz für einen langen Anwendungsnamen! Das erneute Setzen des langen Titels bei onCreateVerwendung der setTitle(int)Methode nützt auch nichts, da der Kurzname für den Benutzer für kurze Zeit sichtbar ist, aber lang genug, um es zu bemerken!

Und - bitte beantworte meine Frage nicht mit einer benutzerdefinierten Titelleiste ... Ich möchte nicht so weit gehen, nur wegen eines dummen Stringtitels! Es ist mühsam, eine benutzerdefinierte Titelleiste für so wenig Effekt zu zeichnen!

Gibt es keine einfache Möglichkeit , dem Launcher eine andere Zeichenfolge zur Anzeige zu geben? Danke für deine Antworten!

Bearbeiten: Ein weiterer Grund, warum eine benutzerdefinierte Titelleiste ein Problem ist, ist, dass sie nicht wie die Standard-Titelleiste aussieht. Ich müsste explizit Dinge tun, damit sie auf jedem Gerät gleich aussieht! Und das kann keine Lösung sein, wenn ich doch kein anderes Aussehen will!

Zordid
quelle

Antworten:

470

<intent-filter>Kann anscheinend ein Label-Attribut haben. Wenn es nicht vorhanden ist, wird das Label von der übergeordneten Komponente (entweder Aktivität oder Anwendung) geerbt. Auf diese Weise können Sie eine Beschriftung für das Startsymbol festlegen, während die Aktivität weiterhin einen eigenen Titel hat.

Beachten Sie, dass dies zwar auf Emulatoren funktioniert, auf realen Geräten jedoch möglicherweise nicht, da dies von der verwendeten Launcher-Implementierung abhängt.

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>

Randnotiz: <intent-filter> kann auch ein Symbolattribut haben, überschreibt jedoch unerklärlicherweise nicht das in der Aktivität angegebene Symbol. Dies kann für Sie wichtig sein, wenn Sie die native ActionBar in SDK 11+ verwenden möchten, die das in der Aktivität angegebene Symbol und Logo verwendet.

Hinzugefügte Informationen: Das Label wird von Activity und nicht von der Anwendung geerbt.

 <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>

In diesem Fall wird app_long_name mit dem Startsymbol angezeigt, wenn wir das Etikett nicht wie oben erwähnt einfügen.

Mark Renouf
quelle
5
Das ist großartig !! Ich werde es heute Abend versuchen. Wow, warum ist so etwas nicht richtig dokumentiert ?? !! Ich weiß, warum ich diese seltsamen XML-Strukturen nicht mag ... ;-)
Zordid
13
Oh nein, oh nein. Jetzt enttäuscht. Reine Android-Starter (auf Emulatoren!) Tun wirklich das, was wir hier besprochen haben, aber z. B. ignoriert der HTC-Launcher das Label-Tag der Absicht. :-( Wie dumm! Asus Eee Pad mit Honeycomb hält sich auch NICHT an dieses Etikett.
Zordid
2
Was Sie also sehen, ist das Aktivitätslabel? Das ist eine Schande. Ich hatte halb erwartet, dass, da dies nicht dokumentiert ist, jeder, der einen Launcher schreibt, wahrscheinlich nicht das richtige Verhalten implementieren würde.
Mark Renouf
12
Funktioniert mit meinem Gingerbread Nexus One, Nexus S sowie "neueren" Versionen :-) Aber leider würde ich aufgrund der Inkonsistenz empfehlen, dies nicht zu verwenden. Ich bin geneigt, die Antwort auch mit einer Warnung zu aktualisieren.
Mark Renouf
3
Ich habe keine Ahnung, warum dies so viele positive Stimmen hat. Testen die Leute ihren Code nicht zuerst auf einem realen Gerät, bevor sie annehmen, dass etwas funktioniert? Diese Lösung funktioniert, wie von anderen angegeben, NICHT auf einem realen Gerät. Ich habe in 4 Geräten (Vanille und Nicht-Vanille Android) und nichts getestet. Dies funktioniert nur auf dem Emulator. Die einzige Möglichkeit, die ich gefunden habe, war die Verwendung von setTitle, wie in Anilas Antwort beschrieben.
Tiago
35

Ich habe nach dem gleichen gesucht und hier ist, was für mich funktioniert hat.

<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>

Dies gibt Ihrem Application Launcher-Symbol einen kurzen Namen.

Um der Anwendungsleiste einen größeren Namen hinzuzufügen, müssen Sie nur Folgendes hinzufügen:

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

zu Ihrer Hauptaktivität Java-Datei.

Anila
quelle
Dies funktioniert unbedingt, wenn Sie den Titel Ihrer Launcher-Aktivität ändern müssen. Der Symbolname blinkt jedoch etwa 1 Sekunde lang.
rphello101
2
Wenn es Ihnen nichts ausmacht, dass Ihre App kurz eine leere Aktionsleiste anzeigt (dh überhaupt keinen Titel), können Sie Ihren Aktionsleistenstil ändern und showTitleaus der entfernen displayOptions. Anschließend können Sie den Titel in der Aktivität onCreatewie folgt aktivieren: this.getActionBar (). SetDisplayOptions (ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); Dies ist besser als das Blinken des Symbolnamens, bedeutet jedoch, dass jede Aktivität in Ihrer Anwendung den Titel aktivieren muss, wenn dies erforderlich ist.
BruceHill
Dies funktioniert unbedingt, wenn Sie den Titel Ihrer Launcher-Aktivität ändern müssen.
Warum nicht setTitle(R.string.app_name);?
Arekolek
10

Die Lösung von Mark Renouf schlägt für mich fehl (mit Nexus 4 und Android 4.4). Es schlägt fehl, wenn Verknüpfungen verwendet werden. Verknüpfungen verwenden die Hauptaktivitätsbezeichnung anstelle des App-Namens. Ich habe einige Apps wie GMail und Google Keep gesehen, die gut funktionieren. Aber wenn Sie sie öffnen, fällt mir auf, dass ein Moment zwischen dem Titel leer ist und der Titel angezeigt wird (was besser zu sein scheint als der Name der App, der blinkt, bevor der Titel mit setTitle () festgelegt wird).

Hier ist die beste Lösung, die ich gefunden habe :

Erstellen Sie einen Stil, in dem die ActionBar den Titel / die Bezeichnung nicht anzeigt:

<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>

Ich verwende eine Navigationsschublade und ein Logo (weil ich ein Logo und ein Symbol für meine App verwende). Sie können alles verwenden, aber nicht showTitle . Legen Sie dann in der Datei AndroidManifest.xml das Thema für die Hauptaktivität fest:

<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>

Legen Sie dann in der onCreate () -Methode der MainActivity den Titel Ihrer Aktionsleiste fest:

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

Danach können Sie anrufen:

getActionBar().setDisplayShowTitleEnabled(true);

Tricky aber wert.

Ferran Negre
quelle
4

Dies wird wahrscheinlich nicht das befriedigen, was Sie tun möchten, aber Sie haben darüber nachgedacht, einen Begrüßungsbildschirm zu erstellen, der sehr kurz angezeigt wird (mit dem Standardtitel) und dann Ihre neue tatsächliche "Haupt" -Aktivität mit dem Titel Ihrer Wahl unter Verwendung der setTitle(int)Methode startet ? Ich habe dies nicht versucht, um zu sehen, ob es funktioniert, aber das könnte zu einer angenehmen Arbeit führen, die nicht die weniger nahtlose Natur dessen zeigt, was Sie erreichen wollen.

Adriaan
quelle
2

Für alle, die die Support / Appcompat-Symbolleiste über die setSupportActionBar()Methode verwenden, kann der Aktivitätstitel in Symbolleisten-XML festgelegt werden:

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

Dadurch werden die im Manifest festgelegten Anwendungs- und Aktivitätsbezeichnungen überschrieben.

android.support.v7.widget.Toolbar

Maksim Ivanov
quelle
1

Ich fand für dieses Problem eine Abhilfe

In manifest.xml

Ihrem Schreiben App Namen in dem android:labelvon der Trägerrakete (Haupt-) Aktivität .

Dadurch wird das Label Ihrer Hauptaktivität mit dem des App-Labels identisch. Schreiben Sie

dann in der onCreate()Funktion Ihrer Launcher-Aktivität (Hauptaktivität) diese Anweisung

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

Schreiben Sie hier das Etikett, das Sie Ihrer Launcher-Aktivität (Hauptaktivität) geben möchten.

Tanuj Yadav
quelle
0

Sie können so etwas tun:

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);
    }
}

Sie müssen ein benutzerdefiniertes Layout erstellen, um den Titel zu speichern. Es könnte so einfach sein wie ( my_title.xmlin diesem Fall genannt):

<?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"/>

In Ihrer AndroidManifest.xmlDatei müssen Sie nur den Titel für die App festlegen, der im Startsymbol angezeigt wird. Für Ihre Aktivität müssen Sie dort keinen Titel festlegen.

Cristian
quelle
1
Ich bezweifle , dass das wirklich wahr: die Beschriftung der Anwendung ist nicht , was das Startprogramm definiert markierungs es nur definiert , wie die Anwendung in der Liste der installierten Apps genannt wird (Einstellungen-> Anwendungen-> Anwendungen verwalten) und dieses Label auch von Android genommen Markt auch. Das möchte ich also nicht ändern. Durch Experimentieren fand ich heraus, dass der Launcher auch den Titel der Aktivität trägt. Abgesehen davon: Ihre Lösung beinhaltet einen tollen Titel, den ich nicht will! Dies sieht nie wie die Standard-Titelleiste aus - oder ich müsste viel tun, um das Standardverhalten zu erhalten - überhaupt nicht gut!
Zordid
Hmm ... es ist noch schlimmer. Ich habe gerade Ihre Lösung ausprobiert. Die Titelleiste sieht jedoch überhaupt nicht wie die Standard-Titelleiste aus, und noch schlimmer, die Standard-Titelleiste (mit dem Kurznamen, den ich nicht sehen möchte) wird kurz vor dem Anzeigen der benutzerdefinierten Titelleiste angezeigt. Also: Diese Lösung entspricht dem Festlegen des Titels mit setTitle. :-(
Zordid
0

Der Launcher zeigt tatsächlich android: label und android: icon für Aktivitäten an, die deklarieren

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

Das Anwendungsetikett nützt also nichts.

Rahul
quelle