Jak ustawić inną etykietę dla programu uruchamiającego niż tytuł działania?

269

To pytanie zostało zadane wcześniej - ale bez zadowalającej odpowiedzi! Więc próbuję ponownie.

Chcę nadać mojej ikonie uruchamiania aplikacji (tej wyświetlanej na ekranie startowym!) Inny, krótszy podpis. Wygląda na to, że program uruchamiający bierze etykietę z sekcji Mainfest na temat etykiety głównej aktywności, jak tutaj:

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

Zmieniłem już pierwotne odniesienie do nazwy mojej aplikacji @ string / nazwa_aplikacji na inny, krótszy zasób string tutaj.

ALE - duży ALE : to oczywiście zmienia domyślny tytuł tego działania! I nie chciałem, żeby tak się stało, jest wystarczająco dużo miejsca na długą nazwę aplikacji! Ponowne ustawienie długiego tytułu onCreateprzy użyciu tej setTitle(int)metody również nie ma sensu, ponieważ krótka nazwa będzie widoczna dla użytkownika przez krótki czas, ale wystarczająco długo, aby to zauważyć!

I - proszę nie odpowiadać na moje pytanie, odnosząc się do niestandardowego paska tytułu ... Nie chcę iść tak daleko, tylko z powodu głupiego tytułu napisu! Trudno jest narysować niestandardowy pasek tytułu, aby uzyskać tak niewielki efekt!

Czy nie ma łatwego sposobu, aby po prostu nadać programowi uruchamiającemu inny ciąg znaków do wyświetlenia? Dzięki za odpowiedzi!

Edycja: Jeszcze jednym powodem, dla którego posiadanie niestandardowego paska tytułowego jest uciążliwe, jest to, że nie będzie on wyglądał jak domyślny pasek tytułowy. Musiałbym jawnie robić rzeczy, aby wyglądały podobnie na każdym urządzeniu! I to nie może być rozwiązanie, jeśli w końcu nie chcę innego wyglądu!

Zordid
źródło

Odpowiedzi:

470

Najwyraźniej <intent-filter>może mieć atrybut label. Jeśli go nie ma, etykieta jest dziedziczona ze składnika nadrzędnego (działania lub aplikacji). Korzystając z tego, możesz ustawić etykietę ikony programu uruchamiającego, jednocześnie mając Aktywność z własnym tytułem.

Pamiętaj, że chociaż działa to na emulatorach, może nie działać na rzeczywistych urządzeniach, ponieważ zależy to od zastosowanej implementacji programu uruchamiającego.

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>

Uwaga dodatkowa: <intent-filter> może również mieć atrybut icon, ale w niewytłumaczalny sposób nie zastępuje ikony określonej w działaniu. Może to być dla Ciebie ważne, jeśli planujesz używać natywnego paska Actionbar w SDK 11+, który używa ikony i logo określonych w działaniu.

Dodano informacje: Etykieta jest dziedziczona z działania, a nie z aplikacji.

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

W takim przypadku nazwa_long_aplikacji zostanie wyświetlona z ikoną programu uruchamiającego, jeśli nie wstawimy do niej etykiety, jak wspomniano powyżej.

Mark Renouf
źródło
5
Ojej, to wspaniale !! Spróbuję dziś wieczorem. Wow, dlaczego coś takiego nie jest odpowiednio udokumentowane? !! Wiem, dlaczego nie lubię tych dziwnych struktur XML ... ;-)
Zordid
13
Och nie, och nie. Rozczarowany teraz. Wyrzutnie czystego Androida (na emulatorach!) Naprawdę robią to, co tutaj omówiliśmy, ale np. Wyrzutnia HTC ignoruje etykietę zamiaru. :-( Jak głupio! Asus Eee Pad z
plastrem
2
Widzisz więc etykietę aktywności? Jaka szkoda. Spodziewałem się, że ponieważ nie jest to udokumentowane, każdy, kto napisze program uruchamiający, prawdopodobnie nie zastosuje prawidłowego zachowania.
Mark Renouf,
12
Działa na moim Gingerbread Nexus One, Nexus S, a także na „nowszych” wydaniach :-) Ale niestety, stary, z powodu niekonsekwencji polecam tego nie używać. Jestem skłonny zaktualizować odpowiedź również ostrzeżeniem.
Mark Renouf,
3
Nie mam pojęcia, dlaczego, u licha, ma tak wiele pozytywnych opinii. Czy ludzie nie testują najpierw swojego kodu na prawdziwym urządzeniu przed założeniem, że coś działa? To rozwiązanie, jak twierdzą inni, NIE działa na prawdziwym urządzeniu. Testowałem na 4 urządzeniach (waniliowy i nie waniliowy Android) i nic. Działa to tylko na emulatorze. Jedynym sposobem, jaki znalazłem, było użycie setTitle zgodnie z opisem w odpowiedzi Anili.
Tiago,
35

Szukałem tego samego i oto, co zadziałało dla mnie.

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

To da krótką nazwę ikonie uruchamiania aplikacji.

Aby dodać większą nazwę do paska aplikacji, wystarczy dodać:

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

do głównego pliku Java aktywności.

Anila
źródło
Działa to bez wątpienia, jeśli musisz zmienić tytuł działania programu uruchamiającego. Jednak ikona miga przez około 1 sekundę.
rphello101,
2
Jeśli nie przeszkadza ci aplikacja wyświetlająca krótko pusty pasek działania (tzn. W ogóle nie ma tytułu), możesz zmienić styl paska działania i usunąć showTitlez niego displayOptions. Następnie możesz włączyć tytuł w działaniu w onCreatenastępujący sposób: this.getActionBar (). SetDisplayOptions (ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); Jest to lepsze niż miganie nazwy ikony, ale oznacza to, że każda czynność w aplikacji będzie musiała włączyć tytuł, jeśli będzie tego wymagać.
BruceHill
Działa to bez wątpienia, jeśli musisz zmienić tytuł działania programu uruchamiającego.
Dlaczego nie setTitle(R.string.app_name);?
arekolek
10

Rozwiązanie Marka Renoufa nie powiodło się (przy użyciu Nexusa 4 i Androida 4.4). Nie udaje się to podczas korzystania ze skrótów, skróty używają głównej etykiety aktywności zamiast nazwy aplikacji. Widziałem niektóre aplikacje, takie jak GMail i Google Keep, które działają dobrze. Ale kiedy je otworzysz, zauważam, że moment między tytułem jest pusty i pojawia się tytuł (co wydaje się lepsze niż miganie nazwy aplikacji przed ustawieniem tytułu za pomocą setTitle ()).

Oto najlepsze rozwiązanie, jakie znalazłem :

Utwórz styl, w którym pasek ActionBar nie wyświetla tytułu / etykiety:

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

Używam szuflady nawigacji i logo (ponieważ używam logo i ikony do mojej aplikacji). Możesz używać cokolwiek, ale nie używaj showTitle . Następnie w AndroidManifest.xml ustaw motyw dla 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>

Następnie w metodzie onCreate () funkcji MainActivity ustaw tytuł paska akcji:

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

Następnie możesz zadzwonić:

getActionBar().setDisplayShowTitleEnabled(true);

Podstępne, ale warte.

Ferran Negre
źródło
4

Prawdopodobnie nie spełni tego, co chcesz zrobić, ale czy pomyślałeś o utworzeniu ekranu powitalnego, który wyświetla się bardzo krótko (z domyślnym tytułem), a następnie uruchamia nową rzeczywistą „główną” aktywność z wybranym tytułem za pomocą setTitle(int)metody ? Nie próbowałem tego, aby sprawdzić, czy to działa, ale może to stworzyć przyjemną pracę, która nie pokazuje mniej niż płynnej natury tego, co próbujesz osiągnąć.

Adriaan
źródło
2

Dla każdej osoby korzystającej z paska narzędzi Support / Appcompat za pomocą tej setSupportActionBar()metody tytuł działania można ustawić w pasku narzędzi Toolbar XML:

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

Spowoduje to zastąpienie etykiet aplikacji i działań ustawionych w manifeście.

android.support.v7.widget.Toolbar

Maksim Iwanow
źródło
1

Znalazłem obejście tego problemu

W manifest.xml

wyraź swoją nazwę aplikacji w android:labelz wyrzutni (głównego) aktywności .

Spowoduje to, że etykieta głównej aktywności będzie taka sama jak etykieta aplikacji.

Następnie, w onCreate()funkcji aktywności Launcher (głównej) napisz tę instrukcję

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

Tutaj wpisz etykietę, którą chcesz nadać aktywności Launcher (głównej).

Tanuj Yadav
źródło
0

Możesz zrobić coś takiego:

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

Musisz utworzyć niestandardowy układ, aby utrzymać tytuł. Może to być tak proste jak ( my_title.xmlw tym przypadku wywoływane ):

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

W swoim AndroidManifest.xmlpliku musisz tylko ustawić tytuł aplikacji, który będzie wyświetlany w ikonie uruchamiania. W przypadku swojej aktywności nie musisz ustawiać tam tytułu.

Cristian
źródło
1
Wątpię, czy to prawda: etykieta aplikacji nie jest tym, co definiuje etykietę programu uruchamiającego - definiuje jedynie nazwę aplikacji na liście zainstalowanych aplikacji (ustawienia-> aplikacje-> zarządzanie aplikacjami), a ta etykieta jest również pobierana przez Androida Rynek też. Więc nie chcę tego zmieniać. Eksperymentując, dowiedziałem się, że to tytuł działania bierze także program uruchamiający. Poza tym: twoje rozwiązanie obejmuje tytułowy kawałek, którego nie chcę! To nigdy nie wygląda jak domyślny pasek tytułu - inaczej musiałbym zrobić wiele, aby uzyskać domyślne zachowanie - wcale nie jest dobre!
Zordid,
Hmm ... jest jeszcze gorzej. Właśnie wypróbowałem twoje rozwiązanie. Ale pasek tytułowy wcale nie wygląda jak domyślny, a co gorsza, domyślny pasek tytułowy (pokazujący krótką nazwę, której nie chcę widzieć) jest wyświetlany na krótko przed pojawieniem się niestandardowego paska tytułowego. Zatem: to rozwiązanie jest takie samo, jak ustawienie tytułu za pomocą setTitle. :-(
Zordid
0

Program uruchamiający faktycznie pokazuje android: label i android: ikona aktywności, które deklarują

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

więc etykieta aplikacji jest bezużyteczna.

Rahul
źródło