Android: Jak zmienić ikonę „Strona główna” ActionBar na coś innego niż ikona aplikacji?

114

Główna ikona mojej aplikacji składa się z dwóch części na jednym obrazie: logo i kilku liter pod nim. Działa to dobrze w przypadku ikony programu uruchamiającego dla aplikacji, ale gdy ikona pojawia się na lewej krawędzi ActionBar, litery są ucinane i nie wygląda to dobrze.

Chciałbym zapewnić ActionBarowi oddzielną wersję ikony, tylko z częścią "logo", a nie literami pod nią, ale jak dotąd były one puste. Szczerze mówiąc, nie mogę znaleźć żadnej odpowiedzi na to, a nawet nie mogę nigdzie znaleźć samego pytania.

Phil Ringsmuth
źródło

Odpowiedzi:

218

ActionBar użyje atrybutu android: logo Twojego manifestu, jeśli taki zostanie podany. Pozwala to na użycie oddzielnych zasobów do rysowania dla ikony (Launcher) i logo (między innymi ActionBar).

Joe
źródło
2
Tak. Możesz również użyć niestandardowego stylu paska akcji, aby zapewnić logo lub ikonę, które będą używane zamiast tych dostarczonych w manifeście.
adamp
@Joe, Dowolne rozwiązanie dla API <11 przy użyciu AppCompat
cafebabe1991
49

W AndroidManifest.xml:

<application
    android:icon="@drawable/launcher"
    android:label="@string/app_name"
    android:name="com..."
    android:theme="@style/Theme">...</Application>

W styles.xml: (zobacz android:icon)

<style name="Theme" parent="@android:style/Theme.Holo.Light">
    <item name="android:actionBarStyle">@style/ActionBar</item>
</style>
<style name="ActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:icon">@drawable/icon</item>
</style>
AlikElzin-kilaka
źródło
android: logo też będzie działać. Nie znam różnicy.
AlikElzin-kilaka
Przepraszamy za rozrywanie ran gojących się :-) Ale różnica polega na tym, że sugerowane tutaj rozwiązanie zmiany stylu powoduje zastosowanie niestandardowej ikony tylko do paska akcji, gdzie zdefiniowanie android:logow manifeście może wpływać również na inne obszary.
dbm
@dbm, czy możesz podać przykład „innych obszarów”?
AlikElzin-kilaka
2
Tak, zaciekawiło mnie to, że zacząłem google na ten temat i tak mówi strona programistów Androida: developer.android.com/guide/topics/manifest/… . Nie jest dla mnie jasne, czym różni się to od andorid:iconatrybutu: developer.android.com/guide/topics/manifest/…
dbm
2
Action Bar doc mówi również można dodać android:icondo <activity>elementu, więc można łatwo zmienić go do różnych działań. Próbowałem tego i zadziałało świetnie. Nie musisz majstrować przy niestandardowym motywie ani martwić się o wpływ na wszystkie działania.
Jason
18

Spróbuj tego wiersza

getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_arrow);
Felix Cruz
źródło
1
UWAGA: setHomeAsUpIndicatorto Android API 18+.
Joshua Pinter,
8

Jeśli korzystasz z AppCompat, jedynym sposobem ustawienia ikony ActionBar na urządzeniach z Gingerbread (API 10) lub niższym jest ustawienie atrybutu android: icon w każdym działaniu w Twoim manifeście lub ustawienie go programowo.

<manifest>
    <application>
        ...
        <activity android:name="com.your.ActivityName"
            ...
            android:icon="@drawable/ab_logo"/>
        ...
   </application>
</manifest>

Aktualizacja: Ostrzegamy jednak, że ikona aplikacji zostanie zastąpiona, jeśli ustawisz atrybut android: icon w działaniu uruchamiającym. Jedyne obejście, jakie znam, to mieć działanie splash lub dummy, które następnie uruchamia Twoje główne działanie.

TheIT
źródło
nie działa !! Próbowałeś tego? Proszę znaleźć rozwiązanie, którego potrzebuję.
Apurva,
8

Zainspirowany TheIT, po prostu uruchomiłem to, manipulując plikiem manifestu, ale w nieco inny sposób. Ustaw ikonę w ustawieniach aplikacji tak, aby większość działań otrzymała ikonę. W działaniu, w którym chcesz wyświetlać logo, dodaj atrybut android: logo do deklaracji działania. W poniższym przykładzie tylko LogoActivity powinno mieć logo, podczas gdy inne domyślnie będą miały ikonę.

<application
    android:name="com.your.app"
    android:icon="@drawable/your_icon"
    android:label="@string/app_name">

    <activity
        android:name="com.your.app.LogoActivity"
        android:logo="@drawable/your_logo"
        android:label="Logo Activity" >

    <activity
        android:name="com.your.app.IconActivity1"
        android:label="Icon Activity 1" >

    <activity
        android:name="com.your.app.IconActivity2"
        android:label="Icon Activity 2" >

</application>

Mam nadzieję, że to pomoże komuś innemu!

dumny
źródło
Używam AppCompat v7, ponieważ chcę obsługiwać Androida 2.3, ale Twoja metoda nie działa.
Liam Xu
6

Spróbuj, jeśli używasz „extends AppCompatActivity” i przedstaw pasek akcji.

 ActionBar eksinbar=getSupportActionBar();
if (eksinbar != null) {
    eksinbar.setDisplayHomeAsUpEnabled(true);
    eksinbar.setHomeAsUpIndicator(R.mipmap.imagexxx);
}
Mustafa
źródło
3

tworzenie logo

w folderach „ drawable-...” utwórz w nich wszystkich logo.png. Lokalizacja folderów: [YOUR APP]\app\src\main\res

W AndroidManifest.xml dodaj wiersz: android:logo="@drawable/logo"

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:logo="@drawable/logo"
    ...

Otóż ​​to.

awariat
źródło
0

Może chcę to sprawdzić, mam wszystko, czego potrzebujesz do ikon aplikacji

http://developer.android.com/guide/practices/ui_guidelines/icon_design.html

aktualizacja

Myślę, że domyślnie używa ikony programu uruchamiającego ... Najlepszym rozwiązaniem jest utworzenie oddzielnego obrazu ... Zaprojektowany dla paska akcji i wykorzystujący to. W tym celu: http://developer.android.com/guide/topics/ui/actionbar.html#ActionItems

Stevanicus
źródło
Dziękuję za ten link i może skończyć się usunięciem liter z mojej ikony i używaniem tej samej ikony „logo” w całej aplikacji, ale być może będę musiał użyć mniejszej jej lub nieco innej wersji w ActionBar, i właśnie tego próbuję się dowiedzieć.
Phil Ringsmuth