Как установить другую метку для лаунчера, а не название активности?

269

Этот вопрос задавался ранее - но без удовлетворительного ответа вообще! Так что я пытаюсь это снова.

Я хочу присвоить значку средства запуска приложений (отображаемому на начальном экране!) Другой, более короткий заголовок. Кажется, программа запуска берет свой ярлык из раздела mainfest о ярлыке основного действия, как здесь:

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

Я уже изменил исходную ссылку на имя моего приложения @ string / app_name на другой, более короткий ресурс строки здесь.

НО - большое НО : это также, конечно, меняет название этого занятия по умолчанию! И я не хотел, чтобы это произошло, достаточно места для длинного имени приложения! Повторная установка длинного заголовка при onCreateиспользовании setTitle(int)метода также не годится, потому что короткое имя будет видно пользователю в течение короткого времени, но достаточно долго, чтобы заметить!

И - пожалуйста, не отвечайте на мой вопрос, ссылаясь на пользовательские заголовки ... Я не хочу идти так долго, просто из-за глупого заголовка строки! Это так сложно - нарисовать собственную строку заголовка для такого маленького эффекта!

Есть ли простой способ просто дать пусковую установку другую строку на экран? Спасибо за ваши ответы!

Редактировать: Еще одна причина, по которой наличие настраиваемой заголовка заголовка - это боль, заключается в том, что он не будет выглядеть как заголовок заголовка по умолчанию, я должен был бы явно сделать вещи, чтобы он выглядел одинаково на каждом устройстве! И это не может быть решением, если, в конце концов, я не хочу другого внешнего вида!

Zordid
источник

Ответы:

470

Видимо <intent-filter>может иметь атрибут метки. Если он отсутствует, метка наследуется от родительского компонента (либо Activity, либо Application). Таким образом, используя это, вы можете установить метку для значка запуска, сохраняя при этом активность с собственным заголовком.

Обратите внимание, что, хотя это работает на эмуляторах, оно может не работать на реальных устройствах, потому что это зависит от используемой реализации модуля запуска.

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>

Примечание: <intent-filter> также может иметь атрибут icon, но по непонятным причинам он не перекрывает значок, указанный в Activity. Это может быть важно для вас, если вы планируете использовать встроенный ActionBar в SDK 11+, в котором используются значок и логотип, указанные в разделе «Упражнение».

Дополнительная информация: метка наследуется от Activity, а не от Application.

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

В этом случае app_long_name будет отображаться со значком запуска, если мы не поместим метку внутрь, как указано выше.

Марк Ренуф
источник
5
Ну и дела, это здорово! Я попробую это сегодня вечером. Вау, почему такая вещь не документирована должным образом ?? !! Я знаю, почему мне не нравятся эти странные XML-структуры ... ;-)
Zordid
13
О нет, о нет Разочарован сейчас. Чистые средства запуска Android (на эмуляторах!) Действительно делают то, что мы обсуждали здесь, но, например, средство запуска HTC игнорирует метку тега намерения. :-( Как глупо! Asus Eee Pad с сотами также НЕ придерживается этого ярлыка.
Zordid
2
Итак, что же вы видите, это ярлык Activity? Это позор. Я наполовину ожидал, что, поскольку это не задокументировано, любой, кто пишет программу запуска, вероятно, не реализует правильное поведение.
Марк Ренуф
12
Работает на моем Gingerbread Nexus One, Nexus S, а также на «более новых» выпусках :-) Но, к сожалению, чувак к несоответствию, я бы порекомендовал не использовать это. Я склонен обновить ответ также предупреждением.
Марк Ренуф
3
Я понятия не имею, почему на земле так много голосов. Разве люди не тестируют свой код на реальном устройстве, прежде чем предположить, что что-то работает? Это решение, как утверждают другие, НЕ работает на реальном устройстве. Я тестировал на 4 устройствах (ванильный и не ванильный Android) и ничего. Это работает только на эмуляторе. Единственным способом, который я нашел, было использование setTitle, как описано в ответе Анилы.
Тиаго
35

Я искал то же самое, и вот что сработало для меня.

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

Это даст короткое имя вашей иконке запуска приложения.

Чтобы добавить большее имя на панель приложения, вам просто нужно добавить:

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

в ваш основной файл активности Java.

Анила
источник
Это работает в обязательном порядке, если вам нужно изменить заголовок в вашей активности запуска. Тем не менее, он мигает имя значка в течение 1 секунды.
rphello101
2
Если вы не возражаете против того, чтобы ваше приложение на короткое время показывало пустую панель действий (то есть вообще без заголовка), вы можете изменить свой стиль панели действий и удалить showTitleиз displayOptions. Затем вы можете включить заголовок в упражнении onCreateследующим образом: this.getActionBar (). SetDisplayOptions (ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); Это лучше, чем мигающее имя иконки, но это означает, что при каждом действии в вашем приложении должен быть включен заголовок, если это требуется.
BruceHill
Это работает в обязательном порядке, если вам нужно изменить заголовок в вашей активности запуска.
Почему нет setTitle(R.string.app_name);?
ареколек
10

Решение Марка Реноуфа мне не удается (с использованием Nexus 4 и Android 4.4). Сбой при использовании ярлыков, ярлыки используют метку основной активности вместо имени приложения. Я видел некоторые приложения, такие как GMail и Google Keep, которые отлично работают. Но когда вы открываете их, я замечаю, что момент между заголовком пустым и появляется заголовок (что лучше, чем мигание имени приложения перед установкой заголовка с помощью setTitle ()).

Итак, вот лучшее решение, которое я нашел :

Создайте стиль, в котором ActionBar не показывает заголовок / метку:

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

Я использую навигационный ящик и использую логотип (потому что я использую логотип и значок для своего приложения). Вы можете использовать что угодно, но не использовать showTitle . Затем в AndroidManifest.xml установите тему для 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>

Затем в методе onCreate () объекта MainActivity установите заголовок панели действий:

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

После этого вы можете позвонить:

getActionBar().setDisplayShowTitleEnabled(true);

Хитро, но стоит.

Ферран Негре
источник
4

Это, вероятно, не удовлетворит то, что вы хотите сделать, но вы подумали о создании заставки, которая будет отображаться очень кратко (с заголовком по умолчанию), а затем запускает новую фактическую "основную" активность с заголовком по вашему выбору, используя setTitle(int)метод ? Я не пробовал это, чтобы увидеть, работает ли это, но это могло бы создать приятную работу вокруг, которая не показывает не совсем плавный характер того, чего вы пытаетесь достичь.

Adriaan
источник
2

Для тех, кто использует Support / Appcompat Toolbar через setSupportActionBar()метод, заголовок Activity может быть установлен в XML панели инструментов:

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

Это заменит метки приложений и действий, установленные в манифесте.

android.support.v7.widget.Toolbar

Максим Иванов
источник
1

Я нашел обходной путь для этой проблемы

В manifest.xml

Напишите свое имя приложения в android:labelиз пусковой установки (основной) деятельности .

Это сделает ярлык вашего основного действия таким же, как и ярлык приложения.

Затем в onCreate()функции вашей Launcher (основной) деятельности напишите это утверждение

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

Здесь напишите ярлык, который вы хотите присвоить своей основной (Launcher) активности.

Танудж Ядав
источник
0

Вы можете сделать что-то вроде этого:

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

Вам нужно будет создать собственный макет, чтобы держать заголовок. Это может быть так же просто, как (вызывается my_title.xmlв этом случае):

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

В вашем AndroidManifest.xmlфайле вы просто должны установить заголовок для приложения, что будет отображаться на значке панели запуска. Для вашей деятельности вам не нужно устанавливать заголовок там.

Cristian
источник
1
Я сомневаюсь, что это действительно так: метка приложения не то, что определяет метку запуска - она ​​просто определяет, как приложение названо в списке установленных приложений (настройки-> приложения-> управлять приложениями), и эта метка также взята Android Рынок тоже. Так что я не хочу это менять. Поэкспериментировав, я обнаружил, что это название деятельности, которое берет и пусковая установка. Кроме того: ваше решение включает в себя название, которое я не хочу! Это никогда не выглядит как строка заголовка по умолчанию вообще - или мне пришлось бы многое сделать, только чтобы получить поведение по умолчанию - совсем не хорошо!
Зордид
Хм ... это еще хуже. Я только что попробовал ваше решение. Но заголовок заголовка совсем не выглядит по умолчанию, и, что еще хуже, заголовок заголовка по умолчанию (показывающий короткое имя, которое я не хочу видеть) отображается незадолго до появления настраиваемого заголовка заголовка. Таким образом: это решение такое же, как просто установка заголовка с помощью setTitle. :-(
Зордид
0

Панель запуска на самом деле показывает android: label и android: значок для активности (й), которые объявляют

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

поэтому метка приложения бесполезна.

Рахул
источник