Come impostare un'etichetta diversa per il programma di avvio anziché il titolo dell'attività?


269

Questa domanda è stata posta prima, ma senza una risposta soddisfacente! Quindi ci sto provando di nuovo.

Voglio dare alla mia icona di avvio dell'applicazione (quella visualizzata sulla schermata di avvio!) Una didascalia diversa, più breve. Sembra che il launcher prenda la sua etichetta dalla sezione mainfest sull'etichetta dell'attività principale, come qui:

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

Ho già modificato il riferimento originale al nome della mia app @ string / app_name in una risorsa stringa più corta e diversa qui.

MA - grande MA : anche questo ovviamente cambia il titolo predefinito di questa attività! E non volevo che ciò accadesse, c'è abbastanza spazio per un nome di applicazione lungo! L'impostazione di nuovo del titolo lungo onCreatenell'uso del setTitle(int)metodo non va bene, perché il nome breve sarà visibile all'utente per un breve periodo, ma abbastanza a lungo da notare!

E - per favore, non rispondere alla mia domanda facendo riferimento a una barra del titolo personalizzata ... Non voglio fare molta strada, solo a causa di uno stupido titolo di stringa! Disegnare una barra del titolo personalizzata per un effetto così scarso è una seccatura!

Non esiste un modo semplice per assegnare al programma di avvio una stringa diversa da visualizzare? Grazie per le tue risposte!

Modifica: un altro motivo per cui avere una barra del titolo personalizzata è un problema è che non sembrerà la barra del titolo predefinita, dovrei fare esplicitamente le cose per farlo sembrare uguale su ogni dispositivo! E quella non può essere una soluzione se, dopo tutto, non voglio un aspetto diverso!

Risposte:


470

Apparentemente <intent-filter>può avere un attributo label. Se è assente, l'etichetta viene ereditata dal componente padre (Attività o Applicazione). Quindi, usando questo, puoi impostare un'etichetta per l'icona di avvio, pur mantenendo l'attività con il suo titolo.

Si noti che, mentre funziona su emulatori, potrebbe non funzionare su dispositivi reali, perché dipende dall'implementazione del launcher utilizzata.

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>

Nota a margine: <intent-filter> può anche avere un attributo icona, ma inspiegabilmente non sovrascrive l'icona specificata nell'Attività. Questo può essere importante per te se prevedi di utilizzare la ActionBar nativa in SDK 11+, che utilizza l'icona e il logo specificati nell'attività.

Informazioni aggiunte: l'etichetta viene ereditata dall'attività e non dall'applicazione.

 <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 questo caso, app_long_name verrà visualizzato con l'icona di avvio, se non inseriamo l'etichetta all'interno come indicato sopra.


5
Accidenti, è fantastico !! Ci proverò stasera. Caspita, perché una cosa del genere non è adeguatamente documentata ?? !! So perché non mi piacciono queste strane strutture XML ... ;-)
Zordid

13
Oh no, oh no. Deluso ora. I lanciatori Android puri (sugli emulatori!) Fanno davvero ciò di cui abbiamo discusso qui, ma ad esempio il lanciatore di HTC ignora il tag etichetta dell'intento. :-( Che stupido! Anche Asus Eee Pad con Honeycomb NON aderisce a quell'etichetta.
Zordid

2
Quindi quello che vedi è l'etichetta Attività? È un peccato. Mi aspettavo quasi che, dal momento che questo non è documentato, probabilmente chiunque scrivesse un launcher non implementasse il comportamento corretto.
Mark Renouf,

12
Funziona sul mio Gingerbread Nexus One, Nexus S e su versioni "più recenti" :-) Ma purtroppo, amico dell'inconsistenza, consiglierei di non usarlo. Sono propenso ad aggiornare la risposta anche con un avvertimento.
Mark Renouf,

3
Non ho idea del perché sulla terra ci siano così tanti voti positivi. Le persone non testano il proprio codice su un dispositivo reale prima di pensare che qualcosa funzioni? Questa soluzione, come affermato da altri, NON funziona su un dispositivo reale. Ho testato su 4 dispositivi (Android vaniglia e non vanilla) e niente. Funziona solo sull'emulatore. L'unico modo che ho trovato è stato usare setTitle come descritto nella risposta di Anila.
Tiago,

35

Stavo cercando la stessa cosa ed ecco cosa ha funzionato per me.

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

Questo darà un breve nome all'icona di avvio dell'applicazione.

Per aggiungere un nome più grande alla barra delle applicazioni devi solo aggiungere:

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

al file java di attività principale.


Funziona a colpo sicuro se devi cambiare il titolo sulla tua attività di avvio. Tuttavia, lampeggia il nome dell'icona per circa 1 secondo.
rphello101,

2
Se non ti dispiace che la tua app mostri brevemente una barra delle azioni vuota (cioè nessun titolo), puoi cambiare lo stile della barra delle azioni e rimuoverla showTitleda displayOptions. Quindi puoi attivare il titolo nell'attività in onCreatequesto modo: this.getActionBar (). SetDisplayOptions (ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); È meglio che il nome dell'icona lampeggi, ma significa che ogni attività nella tua applicazione dovrà attivare il titolo se lo richiede.
BruceHill

Funziona a colpo sicuro se devi cambiare il titolo sulla tua attività di avvio.

Perché no setTitle(R.string.app_name);?
Arekolek,

10

La soluzione di Mark Renouf non mi riesce (usando Nexus 4 e Android 4.4). Non funziona quando si utilizzano le scorciatoie, le scorciatoie utilizzano l'etichetta dell'attività principale anziché il nome dell'app. Ho visto alcune app come GMail e Google Keep che funzionano bene. Ma quando li apri, noto che è come un momento tra il titolo è vuoto e il titolo appare (il che sembra migliore del nome dell'app che lampeggia prima di impostare il titolo usando setTitle ()).

Quindi ecco la migliore soluzione che ho trovato :

Crea uno stile in cui ActionBar non mostra il titolo / etichetta:

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

Sto usando un cassetto di navigazione e un logo (perché uso un logo e un'icona per la mia app). Puoi usare qualunque cosa ma non usare showTitle . Quindi in AndroidManifest.xml, imposta il tema per 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>

Quindi, nel metodo onCreate () di MainActivity, imposta il titolo della barra delle azioni:

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

Dopo di ciò , puoi chiamare:

getActionBar().setDisplayShowTitleEnabled(true);

Ingannevole ma vale la pena.


4

Questo probabilmente non soddisferà ciò che vuoi fare, ma hai pensato di creare una schermata iniziale che venga visualizzata brevemente (con il titolo predefinito) e quindi avvii la tua nuova attività "principale" con il titolo di tua scelta usando il setTitle(int)metodo ? Non ho provato questo per vedere se funziona, ma ciò potrebbe creare un piacevole lavoro in giro che non mostra la natura tutt'altro che perfetta di ciò che stai cercando di ottenere.


2

Per chiunque utilizzi Support / Appcompat Toolbar tramite il setSupportActionBar()metodo, il titolo Attività può essere impostato in Toolbar XML:

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

Ciò sovrascriverà le etichette dell'applicazione e dell'attività impostate nel manifest.

android.support.v7.widget.Toolbar


1

Ho trovato una soluzione alternativa per questo problema

In manifest.xml

Scrivi il nome della tua app nell'area android:labeldi avvio (principale) .

Ciò renderà l'etichetta della tua attività principale uguale a quella dell'etichetta dell'app.

Quindi, nella onCreate()funzione della tua attività di avvio (principale) scrivi questa dichiarazione

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

Qui scrivi l'etichetta che vuoi dare alla tua attività di avvio (principale).


0

Puoi fare qualcosa del genere:

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

Dovrai creare un layout personalizzato per contenere il titolo. Potrebbe essere semplice come (chiamato my_title.xmlin questo caso):

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

Nel tuo AndroidManifest.xmlfile devi solo impostare il titolo per l'app, che è quello che verrà mostrato nell'icona di avvio. Per la tua attività non è necessario impostare un titolo lì.


1
Dubito che sia davvero vero: l'etichetta dell'applicazione non è ciò che definisce l'etichetta del launcher: si limita a definire il nome dell'applicazione nell'elenco delle app installate (impostazioni-> applicazioni-> gestisci applicazioni) e questa etichetta è anche presa da Android Anche mercato. Quindi non voglio cambiarlo. Sperimentando, ho scoperto che è anche il titolo dell'attività che prende il lanciatore. A parte questo: la tua soluzione prevede un titolo carino che non voglio! Questa non sembra mai la barra del titolo predefinita - o dovrei fare molto solo per ottenere un comportamento predefinito - non va affatto bene!
Zordid,

Hmm ... è anche peggio. Ho appena provato la tua soluzione. Ma la barra del titolo non sembra affatto quella predefinita e, peggio ancora, la barra del titolo predefinita (che mostra il nome breve che non voglio vedere) viene visualizzata poco prima che appaia la barra del titolo personalizzata. Pertanto: questa soluzione è uguale all'impostazione del titolo tramite setTitle. :-(
Zordid,

0

Il programma di avvio mostra effettivamente android: label e android: icon per attività che dichiarano

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

quindi l'etichetta dell'applicazione non è di alcuna utilità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.