2010-08-15 9 views
245

Questa domanda è stata posta prima - ma senza nessuna risposta soddisfacente! Quindi ci sto provando di nuovo.Come impostare un'etichetta diversa per il programma di avvio anziché il titolo dell'attività?

Voglio dare l'icona di avvio dell'applicazione (quella visualizzata sullo schermo di avvio!) Una didascalia diversa, più breve. Sembra che il lanciatore prende la sua etichetta dalla sezione Mainfest sulla etichetta del principale attività, come in questo caso:

<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à cambiato il riferimento originale del mio app nome @ string/app_name a un diverso, più corto stringa di risorse qui.

MA - grande MA: questo ovviamente cambia anche 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 il titolo lungo in onCreate utilizzando il metodo setTitle(int) non va bene, perché il nome breve sarà visibile all'utente per un breve periodo, ma abbastanza a lungo da notare!

E - si prega di non rispondere alla mia domanda facendo riferimento a una barra del titolo personalizzata ... Non voglio andare così lontano, solo a causa di un titolo di stringa stupido! È un dolore disegnare una barra del titolo personalizzata per un effetto così piccolo!

Esiste in modo semplice per fornire al programma di avvio una stringa diversa da visualizzare? Grazie per le vostre risposte!

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

risposta

453

Apparentemente <intent-filter> può avere un attributo di etichetta. Se è assente, l'etichetta viene ereditata dal componente principale (attività o applicazione). Quindi, utilizzando questo, è possibile impostare un'etichetta per l'icona di avvio, pur mantenendo l'attività con il proprio titolo.

Si noti che, mentre questo funziona su emulatori, potrebbe non funzionare su dispositivi reali, poiché dipende dall'implementazione del programma di avvio utilizzato.

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 un'icona, ma inspiegabilmente lo fa non di override l'icona specificata nel attività. Questo può essere importante per te se prevedi di utilizzare l'ActionBar nativo in SDK 11+, che utilizza l'icona e il logo specificati nell'attività .

Aggiunto Info: L'etichetta è in fase di Ereditato da Activity e non l'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 un'icona di avvio, se non mettiamo etichetta all'interno di cui sopra.

+4

Gee, è fantastico !! Ci proverò stasera. Wow, perché è una cosa del genere non propriamente documentata ?? !! So perché non mi piacciono queste strane strutture XML ... ;-) – Zordid

+12

Oh no, oh no. Deluso ora. I launcher Android puri (sugli emulatori!) Fanno davvero ciò di cui abbiamo discusso qui, ma ad es. Il programma di avvio di HTC ignora l'etichetta dell'intenzione. :-(Che stupido! Anche Asus Eee Pad con Honeycomb NON aderisce a questa etichetta – Zordid

+2

Quindi quello che vedi è l'etichetta Activity? È un peccato, mi aspettavo quasi che non fosse documentato, chiunque scrivesse un launcher probabilmente non implementerà il comportamento corretto –

0

si può fare qualcosa di simile:

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

dovrete creare un layout personalizzato a detenere il titolo. Potrebbe essere semplice come (chiamato my_title.xml in 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 file AndroidManifest.xml devi solo impostare il titolo per l'applicazione, che è ciò che sta per essere mostrato in l'icona di avvio. Per la tua attività non è necessario impostare un titolo lì.

+1

dubito che questo è proprio vero: l'etichetta dell'applicazione è ** non ** ciò che definisce il programma di avvio etichetta si limita a definire come l'applicazione prende il nome nella lista delle applicazioni installate (Impostazioni-> Applicazioni- > gestisci le applicazioni) e questa etichetta è anche presa da Android Market. Quindi non voglio cambiarlo. Sperimentando ho scoperto che è il titolo dell'attività che anche il programma di avvio prende. A parte questo: la tua soluzione include un titolo di cutom che non voglio! Questo non assomiglia mai alla barra del titolo predefinita - o dovrei fare molto solo per ottenere un comportamento predefinito, non per niente! – Zordid

+0

Hmm ... è anche peggio. Ho appena provato la tua soluzione. Ma la barra del titolo non assomiglia affatto al valore predefinito 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. Quindi: questa soluzione equivale a impostare il titolo usando 'setTitle'. :-( – Zordid

4

Questo probabilmente non soddisferà ciò che si vuole fare, ma avete pensato di creare una schermata iniziale che appare molto brevemente (con il titolo predefinito) e quindi lancia la vostra nuova attività "principale" con il titolo del vostro scegliendo il metodo setTitle(int)? Non ho provato questo per vedere se funziona, ma ciò potrebbe creare un piacevole lavoro che non mostra la natura non perfetta di quello che stai cercando di ottenere.

+0

Questo in realtà funziona con il lecca-lecca! – Keith

28

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 nome breve all'icona di avvio dell'applicazione.

Per aggiungere un nome più grande per la barra delle applicazioni è sufficiente aggiungere:

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

al file di attività di java principale.

+0

Funziona senza problemi se è necessario modificare il titolo sull'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 di azione vuota (cioè nessun titolo), puoi cambiare lo stile della barra delle azioni e rimuovere 'showTitle' da' displayOptions'. Quindi puoi attivare il titolo nell'attività 'onCreate' in questo modo: this.getActionBar(). SetDisplayOptions (ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); Questo è migliore del nome dell'icona lampeggiante, ma significa che ogni attività nella tua applicazione dovrà attivare il titolo se lo richiede. – BruceHill

+0

Funziona senza problemi se è necessario modificare il titolo sull'attività di avvio. –

9

Soluzione di Mark Renouf non riesce a me (utilizzando Nexus 4 e Android 4.4). Fallisce quando si usano scorciatoie, le scorciatoie usano l'etichetta di attività principale al posto del nome dell'app. Ho visto alcune app come GMail e Google Keep che funzionano bene. Ma quando li apri, noto che è come un momento in cui il titolo è vuoto e appare il titolo (che sembra migliore del nome dell'app che lampeggia prima di impostare il titolo usando setTitle()).

Così qui è la soluzione migliore che ho trovato :

creare uno stile in cui l'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 l'utilizzo di un logo (perché uso un logo e un'icona per la mia app). È possibile utilizzare qualsiasi cosa, ma non utilizzare showTitle. Poi nel AndroidManifest.xml, impostare il tema per il 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> 

Poi, nel metodo onCreate() della MainActivity, impostare il titolo della vostra barra delle azioni:

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

Dopo esso, è possibile chiamare:

getActionBar().setDisplayShowTitleEnabled(true); 

Tricky, ma vale la pena.

1

ho trovato una soluzione per questo problema

In manifest.xml

Scrivere il nome tuo dell'applicazione nel android:label del lanciatore (principale) di attività.

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

Poi, nella funzione onCreate() del Launcher (principale) attività scrivere questa dichiarazione

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

Qui scrivere l'etichetta che si vuole dare al vostro Launcher (principale) di attività.

0

Il lanciatore mostra in realtà Android: etichetta e Android: icona di attività (i) che dichiarano

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

modo etichetta applicazione è di alcuna utilità.

0

per chiunque utilizzi Support/AppCompat Toolbar tramite il metodo setSupportActionBar(), il titolo di attività può essere impostato in Toolbar XML:

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

Questo sovrascriverà etichette applicazioni e attività specificati nel manifesto.

android.support.v7.widget.Toolbar

Problemi correlati