Como definir um rótulo diferente para o iniciador, em vez do título da atividade?

269

Esta pergunta já foi feita antes - mas sem resposta satisfatória! Então, eu estou tentando novamente.

Desejo atribuir ao ícone do iniciador de aplicativos (o que é exibido na tela inicial!) Uma legenda diferente e mais curta. Parece que o lançador pega seu rótulo na seção principal sobre o rótulo da atividade principal, como aqui:

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

Eu já alterei a referência original para o nome do meu aplicativo @ string / app_name para um recurso de string mais curto diferente aqui.

MAS - grande MAS : isso também altera o título padrão desta atividade! E eu não queria que isso acontecesse, há espaço suficiente para um nome de aplicativo longo! Definir o título longo novamente ao onCreateusar o setTitle(int)método também não é bom, porque o nome abreviado ficará visível para o usuário por um curto período de tempo, mas por tempo suficiente para ser observado!

E - por favor, não responda minha pergunta consultando uma barra de título personalizada ... Eu não quero ir tão longe, apenas por causa de um título de string estúpido! É difícil desenhar uma barra de título personalizada para tão pouco efeito!

Não existe uma maneira fácil de fornecer ao lançador uma sequência diferente para exibir? Obrigado por suas respostas!

Edit: Mais uma razão pela qual ter uma barra de título personalizada é uma dor é que ela não se parecerá com a barra de título padrão, eu precisaria fazer coisas explicitamente para torná-la parecida em cada dispositivo! E isso não pode ser uma solução se, afinal, eu não quero uma aparência diferente!

Zordid
fonte

Respostas:

470

Aparentemente, <intent-filter>pode ter um atributo label. Se estiver ausente, o rótulo será herdado do componente pai (Atividade ou Aplicativo). Portanto, usando isso, você pode definir um rótulo para o ícone do iniciador, mantendo a Atividade com seu próprio título.

Observe que, embora funcione em emuladores, pode não funcionar em dispositivos reais, porque depende da implementação do iniciador usada.

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: O <intent-filter> também pode ter um atributo de ícone, mas inexplicavelmente não substitui o ícone especificado na Atividade. Isso pode ser importante para você, se você planeja usar a ActionBar nativa no SDK 11+, que usa o Ícone e o logotipo especificados na Atividade.

Informações adicionadas: o rótulo está sendo herdado da Atividade e não do Aplicativo.

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

Nesse caso, app_long_name será exibido com o ícone do iniciador, se não colocarmos o rótulo dentro, como mencionado acima.

Mark Renouf
fonte
5
Nossa, que ótimo! Vou tentar hoje à noite. Uau, por que tal coisa não está devidamente documentada ?? !! Eu sei porque eu não gosto dessas estruturas XML estranhas ... ;-)
Zordid
13
Oh não, oh não. Decepcionado agora. Os lançadores puros do Android (em emuladores!) Realmente fazem o que discutimos aqui, mas, por exemplo, o lançador da HTC ignora a etiqueta da intenção. ! :-( Como estúpido Asus Eee Pad com Honeycomb também não aderir a esse rótulo.
Zordid
2
Então, o que você vê é o rótulo de atividade? Isso é uma vergonha. Eu meio que esperava que, como isso não está documentado, qualquer pessoa que esteja escrevendo um iniciador provavelmente não implementaria o comportamento correto.
Mark Renouf
12
Funciona no meu Gingerbread Nexus One, Nexus S e em versões "mais recentes" :-) Mas, infelizmente, cara pela inconsistência que eu recomendaria não usar. Estou inclinado a atualizar a resposta com um aviso também.
Mark Renouf
3
Não tenho ideia de por que diabos isso tem tantos votos positivos. As pessoas não testam seu código em um dispositivo real antes de assumir que algo está funcionando? Esta solução, conforme declarada por outros, NÃO funciona em um dispositivo real. Eu testei em 4 dispositivos (Android e não-baunilha) e nada. Isso funciona apenas no emulador. A única maneira que encontrei foi usar o setTitle, conforme descrito na resposta de Anila.
Tiago
35

Eu estava procurando a mesma coisa e aqui está o que funcionou para mim.

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

Isso dará um nome abreviado ao ícone do iniciador de aplicativos.

Para adicionar um nome maior à barra de aplicativos, basta adicionar:

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

ao seu arquivo java de atividade principal.

Anila
fonte
Isso funciona sem falhas se você precisar alterar o título na sua atividade do iniciador. No entanto, ele pisca o nome do ícone por aproximadamente 1 segundo.
Rphello101
2
Se você não se importa que seu aplicativo mostre brevemente uma barra de ação em branco (ou seja, nenhum título), você pode alterar o estilo da barra de ação e remover showTitledo displayOptions. Em seguida, você pode ativar o título na atividade onCreateassim: this.getActionBar (). SetDisplayOptions (ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); É melhor do que o nome do ícone piscando, mas significa que todas as atividades em seu aplicativo precisarão ativar o título, se necessário.
BruceHill
Isso funciona sem falhas se você precisar alterar o título na sua atividade do iniciador.
Por que não setTitle(R.string.app_name);?
arekolek
10

A solução de Mark Renouf falha para mim (usando o Nexus 4 e o Android 4.4). Falha ao usar atalhos, os atalhos usam o rótulo principal da atividade em vez do nome do aplicativo. Vi alguns aplicativos como GMail e Google Keep que funcionam bem. Mas quando você os abre, percebo que é um momento entre o título em branco e o título aparece (o que parece melhor do que o nome do aplicativo piscando antes de definir o título usando setTitle ()).

Então, aqui está a melhor solução que encontrei :

Crie um estilo em que o ActionBar não mostre o título / rótulo:

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

Estou usando uma gaveta de navegação e um logotipo (porque uso um logotipo e um ícone no meu aplicativo). Você pode usar o que quiser, mas não use showTitle . Em AndroidManifest.xml, defina o tema para 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>

Em seguida, no método onCreate () de MainActivity, defina o título da sua barra de ação:

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

Depois disso , você pode ligar para:

getActionBar().setDisplayShowTitleEnabled(true);

Complicado, mas vale a pena.

Ferran Negre
fonte
4

Provavelmente, isso não satisfará o que você deseja fazer, mas você pensou em criar uma tela inicial que seja exibida rapidamente (com o título padrão) e inicie sua nova atividade "principal" real com o título de sua escolha, usando o setTitle(int)método ? Eu não tentei isso para ver se funciona, mas isso pode criar uma solução agradável que não mostra a natureza menos que perfeita do que você está tentando alcançar.

Adriaan
fonte
2

Para quem usa a Barra de Ferramentas de Suporte / Appcompat através do setSupportActionBar()método, o título da Atividade pode ser definido no XML da Barra de Ferramentas:

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

Isso substituirá os rótulos de aplicativo e atividade definidos no manifesto.

android.support.v7.widget.Toolbar

Maksim Ivanov
fonte
1

Encontrei uma solução alternativa para esse problema

Em manifest.xml

Escreva o nome do seu aplicativo na atividade android:labeldo iniciador (principal) .

Isso tornará o rótulo da sua atividade principal o mesmo do rótulo do aplicativo.

Em seguida, na onCreate()função de sua atividade do Launcher (principal), escreva esta declaração

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

Aqui, escreva o rótulo que você deseja atribuir à sua atividade do Launcher (principal).

Tanuj Yadav
fonte
0

Você pode fazer algo assim:

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

Você precisará criar um layout personalizado para conter o título. Pode ser tão simples quanto (chamado my_title.xmlneste 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"/>

No seu AndroidManifest.xmlarquivo, você apenas precisa definir o título do aplicativo, que é o que será mostrado no ícone do iniciador. Para sua atividade, você não precisa definir um título lá.

Cristian
fonte
1
Duvido que isso seja realmente verdade: o rótulo do aplicativo não é o que define o rótulo do iniciador - apenas define como o aplicativo é nomeado na lista de aplicativos instalados (configurações-> aplicativos-> gerenciar aplicativos) e esse rótulo também é usado pelo Android Mercado também. Então, eu não quero mudar isso. Ao experimentar, descobri que é o título da atividade que o lançador também leva. Além disso: sua solução envolve um título interessante que eu não quero! Isso nunca se parece com a barra de título padrão - ou eu teria que fazer muito apenas para ter um comportamento padrão - nada bom!
Zordid 15/08/10
Hmm ... é ainda pior. Eu apenas tentei sua solução. Mas, a barra de título não se parece com o padrão e, pior ainda, a barra de título padrão (mostrando o nome abreviado que não quero ver) é exibida logo antes da barra de título personalizada aparecer. Assim: esta solução é a mesma que apenas definir o título usando setTitle. :-(
Zordid
0

Na verdade, o iniciador mostra android: label e android: icon para atividade (s) que declaram

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

portanto, o rótulo do aplicativo é inútil.

Rahul
fonte