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

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

Я хочу дать своему значку запуска приложений (тот, который отображается на стартовом экране!) Другой, более короткий заголовок. Кажется, что пусковая установка берет свою метку из раздела 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>

I already changed the original reference to my app's name @string/app_name to a different, shorter string resource here.

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

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

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

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


person Zordid    schedule 15.08.2010    source источник


Ответы (8)


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

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

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> также может иметь атрибут значка, но по необъяснимым причинам он не переопределяет значок, указанный в Activity. Это может быть важно для вас, если вы планируете использовать собственный ActionBar в SDK 11+, который использует значок и логотип, указанные в Activity.

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

 <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 будет отображаться со значком запуска, если мы не поместим метку внутри, как указано выше.

person Mark Renouf    schedule 30.08.2011
comment
Здорово !! Я попробую сегодня вечером. Вау, почему это не задокументировано должным образом ?? !! Я знаю, почему мне не нравятся эти странные XML-структуры ... ;-) - person Zordid; 01.09.2011
comment
О нет, нет. Разочарован сейчас. Чистые пусковые установки Android (на эмуляторах!) Действительно делают то, что мы обсуждали здесь, но, например, Программа запуска HTC игнорирует метку намерения. :-( Как глупо! Asus Eee Pad с Honeycomb тоже НЕ придерживается этого ярлыка. - person Zordid; 04.09.2011
comment
Итак, что вы видите, это ярлык Activity? Это позор. Я наполовину ожидал, что, поскольку это не задокументировано, любой, кто пишет пусковую установку, вероятно, не реализует правильное поведение. - person Mark Renouf; 04.09.2011
comment
Хорошо, это должно быть так. Единственное место, где я видел, что это работает, было в эмуляторе с чистым Android. Итак, я ожидаю, что он будет работать и на устройствах Nexus. То, что программа запуска HTC не соблюдает недокументированный тег, понятно, но почему мой Asus Eee Pad Transformer с Android 3.2 не работает? А лаунчер тоже переделали? Надо попробовать это в эмуляторе ... - person Zordid; 05.09.2011
comment
Работает на моих Gingerbread Nexus One, Nexus S, а также на более новых выпусках :-) Но, к сожалению, чувак, я бы рекомендовал не использовать это. Я также склонен обновить ответ предупреждением. - person Mark Renouf; 06.09.2011
comment
Вопрос: Я стремлюсь сделать то же самое. Мой лейбл работает так, как я хочу, на моем эмуляторе, но не на моем реальном устройстве. Теории? - person gkiar; 25.02.2012
comment
То же, что и с другими: он работает на эмуляторе, но не на реальном устройстве (Motorola Defy +, GO Launcher EX) - person Kuitsi; 30.07.2013
comment
Обнаружена непредвиденная функция (4.1): ярлык ярлыка приложения автоматически изменен на имя действия. Какие-либо предложения? - person Konstantin Konopko; 27.10.2013
comment
У меня такая же проблема, как у konopko на моем Nexus 4 и Android 4.4. Сокращения используют название действия вместо ярлыка приложения. С другой стороны, я вижу, что GMail или Google Keep, они делают правильно (но не знают как). - person Ferran Negre; 28.04.2014
comment
Не работает для меня и в Lollipop, похоже, что метка активности запуска, если установлена, всегда будет иметь приоритет над меткой фильтра намерений. - person hidro; 26.01.2015
comment
я не понимаю :( может кто-нибудь объяснить это в видео? - person Wiguna R; 21.04.2016
comment
+1, однако, как упоминалось в этой ветке, не работает в Lollipop. Небольшое примечание: учитывая тот факт, что приложение Gmail показывает Gmail в заголовке на долю секунды при запуске, это мгновенно меняется на Входящие. Это означает, что даже Google прибегает к программному изменению названия первого действия, и это на самом деле не так уж и ужасно. - person Neurotransmitter; 26.04.2016
comment
Я понятия не имею, почему у него так много голосов. Разве люди не тестируют свой код на реальном устройстве, прежде чем предположить, что что-то работает? Это решение, как утверждают другие, НЕ работает на реальном устройстве. Я тестировал на 4 устройствах (ванильный и не ванильный Android) и ничего. Это работает только на эмуляторе. Единственный способ, который я нашел, - это использовать setTitle, как описано в ответе Анилы. - person Bitcoin Cash - ADA enthusiast; 22.02.2017
comment
Допустим, у меня есть имя моего приложения для горячей линии 2.9, и теперь я обновляю свое имя приложения до горячей линии 3.0 в магазине воспроизведения и в манифесте. после этого, когда я обновляю приложение, приложение обновляется внутренне нормально, но имя приложения на устройстве по-прежнему 2.9. если я удалю предыдущую и установлю новую копию, то имя будет 3.0, иначе нет. пожалуйста, предложите !!!! - person Sagar Nayak; 22.04.2017
comment
Могу подтвердить, что это не работает на Pixel 2XL в 2020 году. - person David Read; 16.03.2020
comment
Я думаю, что решение не работает - см. stackoverflow.com/q/61328477/2401535. - person Marian Paździoch; 20.04.2020

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

<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 деятельности.

person Anila    schedule 05.04.2012
comment
Это сработает в обязательном порядке, если вам нужно изменить заголовок активности в пусковой установке. Однако название значка отображается примерно на 1 секунду. - person rphello101; 11.09.2012
comment
Если вы не возражаете против того, чтобы ваше приложение на короткое время показывало пустую панель действий (т. Е. Вообще без заголовка), вы можете изменить стиль панели действий и удалить showTitle из displayOptions. Затем вы можете включить заголовок в действии onCreate следующим образом: this.getActionBar (). SetDisplayOptions (ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); Это лучше, чем мигание имени значка, но это означает, что каждое действие в вашем приложении должно включать заголовок, если он этого требует. - person BruceHill; 27.03.2013
comment
Это сработает в обязательном порядке, если вам нужно изменить заголовок активности в пусковой установке. - person ; 15.02.2016
comment
Почему не setTitle(R.string.app_name);? - person arekolek; 18.11.2017

Решение Марка Ренуфа мне не подходит (с использованием 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);

Сложно, но того стоит.

person Ferran Negre    schedule 28.04.2014

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

person Adriaan    schedule 25.08.2010

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

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

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

android.support.v7.widget.Toolbar

person Maksim Ivanov    schedule 02.12.2017

Я нашел способ решения этой проблемы

В manifest.xml

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

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

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

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

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

person Tanuj Yadav    schedule 12.08.2017

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

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 файле вам просто нужно установить заголовок для приложения, который будет отображаться на значке запуска. Для вашей деятельности вам не нужно указывать там заголовок.

person Cristian    schedule 15.08.2010
comment
Я сомневаюсь, что это действительно так: ярлык приложения не определяет ярлык средства запуска - он просто определяет, как приложение названо в списке установленных приложений (настройки- ›приложения-› управление приложениями) и этот ярлык также используется Android Market. Так что я не хочу этого менять. Экспериментируя, я выяснил, что это название действия также принимает пусковая установка. Кроме того: ваше решение включает сокращенный заголовок, который мне не нужен! Это вообще никогда не выглядит как строка заголовка по умолчанию - иначе мне пришлось бы многое сделать, чтобы получить поведение по умолчанию - совсем не хорошо! - person Zordid; 16.08.2010
comment
Хм ... это еще хуже. Я просто попробовал ваше решение. Но строка заголовка совсем не выглядит как строка заголовка по умолчанию, и, что еще хуже, строка заголовка по умолчанию (показывающая короткое имя, которое я не хочу видеть) отображается незадолго до появления настраиваемой строки заголовка. Таким образом: это решение аналогично установке заголовка с помощью setTitle. :-( - person Zordid; 16.08.2010

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

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

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

person Rahul    schedule 29.09.2017