¿Cómo establecer una etiqueta diferente para el iniciador en lugar del título de la actividad?

269

Esta pregunta ya se ha hecho antes, ¡pero sin ninguna respuesta satisfactoria! Así que lo estoy intentando de nuevo.

Quiero darle a mi icono de iniciador de aplicaciones (¡el que se muestra en la pantalla de inicio!) Un subtítulo diferente y más corto. Parece que el iniciador toma su etiqueta de la sección del festival principal sobre la etiqueta de la actividad principal, como aquí:

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

Ya cambié la referencia original al nombre de mi aplicación @ string / app_name a un recurso de cadena diferente y más corto aquí.

PERO - grande PERO : ¡esto también, por supuesto, cambia el título predeterminado de esta actividad! Y no quería que eso sucediera, ¡hay suficiente espacio para un nombre de aplicación largo! Configurar el título largo nuevamente al onCreateusar el setTitle(int)método tampoco sirve, porque el nombre corto será visible para el usuario por un corto tiempo, ¡pero lo suficiente como para darse cuenta!

Y, por favor, no responda mi pregunta refiriéndose a una barra de título personalizada ... ¡No quiero ir tan lejos, solo por un estúpido título de cadena! ¡Es una molestia dibujar una barra de título personalizada para tan poco efecto!

¿No hay una manera fácil de darle al lanzador una cadena diferente para mostrar? ¡Gracias por tus respuestas!

Editar: Una razón más por la que tener una barra de título personalizada es una molestia es que no se verá como la barra de título predeterminada, ¡tendría que hacer cosas explícitamente para que se parezca en cada dispositivo! ¡Y eso no puede ser una solución si, después de todo, no quiero una apariencia diferente!

Zordid
fuente

Respuestas:

470

Aparentemente <intent-filter>puede tener un atributo de etiqueta. Si está ausente, la etiqueta se hereda del componente principal (ya sea Actividad o Aplicación). Entonces, usando esto, puede establecer una etiqueta para el icono del iniciador, mientras sigue teniendo la Actividad con su propio título.

Tenga en cuenta que, si bien esto funciona en emuladores, es posible que no funcione en dispositivos reales, porque depende de la implementación del iniciador que se utilice.

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 al margen: <intent-filter> también puede tener un atributo de icono, pero inexplicablemente no anula el icono especificado en la Actividad. Esto puede ser importante para usted si planea usar la barra de acción nativa en SDK 11+, que usa el icono y el logotipo especificados en la actividad.

Información agregada: la etiqueta se hereda de Activity y no de la Aplicación.

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

En este caso, se mostrará app_long_name con el ícono del iniciador, si no ponemos la etiqueta dentro como se mencionó anteriormente.

Mark Renouf
fuente
55
Gee, eso es genial !! Lo intentaré esta noche. Wow, ¿por qué tal cosa no está debidamente documentada? Sé por qué no me gustan estas extrañas estructuras XML ... ;-)
Zordid
13
Oh no, oh no Decepcionado ahora. Los lanzadores de Android puros (¡en emuladores!) Realmente hacen lo que discutimos aquí, pero, por ejemplo, el iniciador de HTC ignora la etiqueta de la intención. :-( ¡Qué estúpido! Asus Eee Pad con Honeycomb tampoco se adhiere a esa etiqueta.
Zordid
2
Entonces, ¿lo que estás viendo es la etiqueta Actividad? Es una pena. Casi esperaba que, dado que esto no está documentado, cualquiera que escriba un lanzador probablemente no implementaría el comportamiento correcto.
Mark Renouf
12
Funciona en mi Gingerbread Nexus One, Nexus S, así como en las versiones "más nuevas" :-) Pero lamentablemente, amigo de la inconsistencia, recomendaría no usar esto. Me inclino a actualizar la respuesta con una advertencia también.
Mark Renouf
3
No tengo idea de por qué demonios tiene tantos votos a favor. ¿No prueban las personas su código en un dispositivo real antes de asumir que algo funciona? Esta solución, como lo han dicho otros, NO funciona en un dispositivo real. He probado en 4 dispositivos (Android vainilla y no vainilla) y nada. Esto solo funciona en el emulador. La única forma que encontré fue usar setTitle como se describe en la respuesta de Anila.
Tiago
35

Estaba buscando lo mismo y esto es lo que funcionó para mí.

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

Esto le dará un nombre corto al ícono del iniciador de aplicaciones.

Para agregar un nombre más grande a la barra de aplicaciones solo tiene que agregar:

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

a su archivo java de actividad principal.

Anila
fuente
Esto funciona sin falta si necesita cambiar el título de su actividad de iniciador. Sin embargo, muestra el nombre del icono durante aproximadamente 1 segundo.
rphello101
2
Si no le importa que su aplicación muestre una barra de acción en blanco brevemente (es decir, sin título), puede cambiar el estilo de su barra de acción y eliminarla showTitlede displayOptions. Luego puede activar el título en la actividad de onCreateesta manera: this.getActionBar (). SetDisplayOptions (ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); Esto es mejor que el nombre del ícono parpadeando, pero significa que cada actividad en su aplicación tendrá que activar el título si lo requiere.
BruceHill
Esto funciona sin falta si necesita cambiar el título de su actividad de iniciador.
¿Por qué no setTitle(R.string.app_name);?
arekolek
10

La solución de Mark Renouf me falla (usando Nexus 4 y Android 4.4). Falla cuando se usan accesos directos, los accesos directos usan la etiqueta de actividad principal en lugar del nombre de la aplicación. Vi algunas aplicaciones como GMail y Google Keep que funcionan bien. Pero cuando los abres, noto que es como un momento entre el título en blanco y aparece el título (que parece mejor que el nombre de la aplicación parpadeando antes de configurar el título usando setTitle ()).

Así que aquí está la mejor solución que encontré :

Cree un estilo donde ActionBar no muestre el título / etiqueta:

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

Estoy usando un cajón de navegación y un logotipo (porque uso un logotipo y un icono para mi aplicación). Puede usar lo que sea, pero no use showTitle . Luego, en AndroidManifest.xml, configure el 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>

Luego, en el método onCreate () de MainActivity, establezca el título de su Barra de acción:

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

Después de eso , puede llamar:

getActionBar().setDisplayShowTitleEnabled(true);

Difícil pero vale la pena.

Ferran Negre
fuente
4

Esto probablemente no satisfaga lo que quiere hacer, pero ¿ha pensado en crear una pantalla de presentación que se muestre muy brevemente (con el título predeterminado) y luego inicie su nueva actividad "principal" real con el título que elija usando el setTitle(int)método ? No he intentado esto para ver si funciona, pero eso podría crear un trabajo agradable que no muestre la naturaleza menos que perfecta de lo que está tratando de lograr.

Adriaan
fuente
2

Para cualquiera que use Support / Appcompat Toolbar a través del setSupportActionBar()método, el título de Actividad se puede establecer en Toolbar XML:

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

Esto anulará las etiquetas de aplicación y actividad establecidas en el manifiesto.

android.support.v7.widget.Toolbar

Maksim Ivanov
fuente
1

Encontré una solución para este problema

en manifest.xml

Escriba el nombre de su aplicación en la actividad android:labeldel iniciador (principal) .

Esto hará que la etiqueta de su actividad principal sea igual a la de la etiqueta de la aplicación.

Luego, en onCreate()función de su actividad de Lanzador (principal), escriba esta declaración

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

Aquí escriba la etiqueta que desea dar a su actividad de Lanzador (principal).

Tanuj Yadav
fuente
0

Puedes hacer algo como esto:

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

Tendrá que crear un diseño personalizado para mantener el título. Podría ser tan simple como (llamado my_title.xmlen este 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"/>

En su AndroidManifest.xmlarchivo solo tiene que establecer el título de la aplicación, que es lo que se mostrará en el icono del iniciador. Para su actividad no necesita establecer un título allí.

Cristian
fuente
1
Dudo que eso sea realmente cierto: la etiqueta de la aplicación no es lo que define la etiqueta del iniciador, simplemente define cómo se nombra la aplicación en la lista de aplicaciones instaladas (configuración-> aplicaciones-> administrar aplicaciones) y Android también toma esta etiqueta Mercado también. Entonces no quiero cambiar eso. Al experimentar descubrí que también es el título de la actividad el que toma el lanzador. Aparte de eso: ¡su solución implica un título sin formato que no quiero! Esto nunca se parece a la barra de título predeterminada, o tendría que hacer mucho solo para obtener el comportamiento predeterminado, ¡no es nada bueno!
Zordid
Hmm ... es aún peor. Acabo de probar tu solución. Pero, la barra de título no se parece a la predeterminada y, lo que es peor, la barra de título predeterminada (que muestra el nombre corto que no quiero ver) se muestra poco antes de que aparezca la barra de título personalizada. Por lo tanto: esta solución es lo mismo que establecer el título usando setTitle. :-(
Zordid
0

El lanzador en realidad muestra android: label y android: icon para actividad (es) que declara

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

entonces la etiqueta de la aplicación no sirve.

Rahul
fuente