Jak dostosować przycisk Wstecz na pasku ActionBar

188

Udało mi się dostosować tło paska działania, obraz logo i kolor tekstu, korzystając z następujących sugestii:
Android: Jak zmienić ikonę „Strona główna” ActionBar na inną niż ikona aplikacji?
Kolor tekstu
ActionBar Obraz tła ActionBar

Ostatnim elementem, który chcę dostosować, jest obraz przycisku wstecz. Domyślnie jest szary i chciałbym, żeby był biały. Działa albo zmiana koloru, określenie rysunku lub po prostu uczynienie go przezroczystym (i dodanie szewronu do mojego niestandardowego obrazu logo). Jak mam to zrobić?

Sunil Gowda
źródło
1
Na pasku akcji nie ma przycisku WSTECZ. Przycisk BACK znajduje się na pasku systemowym lub nie jest wyświetlany na ekranie (w przypadku urządzeń wyposażonych w przycisk BACK poza ekranem).
CommonsWare
1
@CommonsWare, nie jestem pewien, jak nazywa się „lewy szewron” na pasku akcji - ale to właśnie nazywam przyciskiem wstecz. Myślę, że oczekuje się zastąpienia fizycznego przycisku Wstecz na urządzeniach z Androidem w przyszłości.
Sunil Gowda
13
Nie i nie Jest to wskaźnik „w górę” (pomimo orientacji strzałki). Go włączyć poprzez setDisplayHomeAsUpEnabled()sprawie ActionBar. W szczególności NIE powinno się po prostu „cofać”. Oznacza to, że dotknięcie ikony aplikacji spowoduje przejście do „hierarchii” w górę, a nie powrót do poprzedniej aktywności (podobnie jak przycisk WSTECZ na pasku systemowym).
CommonsWare
2
„a co z nowymi urządzeniami, które nie mają fizycznego przycisku powrotu, czy wszystkie wyświetlają„ miękki ”przycisk powrotu” - wszystkie powinny mieć przycisk BACK na pasku systemowym.
CommonsWare,
3
tylko dodać w wielu przypadkach przycisk UP BĘDZIE po prostu wrócić. Zobacz „Gdy poprzednio oglądany ekran jest również hierarchicznym rodzicem bieżącego ekranu, naciśnięcie klawisza Wstecz będzie miało taki sam skutek jak naciśnięcie przycisku W górę - jest to częste zjawisko”. Developer.android.com/design/patterns /navigation.html
Dori

Odpowiedzi:

390

Wskaźnik afordancji „w górę” zapewnia rysownica określona w homeAsUpIndicatoratrybucie motywu. Aby zastąpić go własną wersją niestandardową, byłoby to mniej więcej tak:

<style name="Theme.MyFancyTheme" parent="android:Theme.Holo">
    <item name="android:homeAsUpIndicator">@drawable/my_fancy_up_indicator</item>
</style>

Jeśli aplikacja obsługuje wersję starszą niż 3.0, upewnij się, że umieściłeś tę wersję motywu niestandardowego w values-v11podobnym formacie.

Jake Wharton
źródło
10
też dla mnie działa. Zadeklarowałem wewnątrz zestawu stylów jako mojego ActionBarStyle jak w AOSP na githubie, ale to nie działało - przejście do głównego tematu załatwiło sprawę! +1
Dori
37
<item name="android:homeAsUpIndicator">@drawable/my_fancy_up_indicator</item>nie działało dla mnie, ale działało <item name="homeAsUpIndicator">@drawable/my_fancy_up_indicator</item>. Zgadnij, to jest wersja na Androida
Michał K,
6
Czy jest jakiś sposób, aby ustawić górne i dolne wypełnienie dla tego ustawienia na 0dp?
James McCracken
3
@JamesMcCracken jedynym sposobem, w jaki mogłem to zrobić, był niestandardowy układ.
greg7gkb
4
Ktoś zmusił to do pracy Navigation Drawer? Myślę, że ActionBarDrawerTogglezamienia wskaźnik up na własny, dlatego ustawienie go na styl nie ma żadnego efektu ...
Lucas Jota,
89

Możesz więc łatwo to programowo zmienić za pomocą funkcji homeAsUpIndicator (), która została dodana w interfejsie API Androida na poziomie 18 i wyższym.

ActionBar().setHomeAsUpIndicator(R.drawable.ic_yourindicator);

Jeśli korzystasz z biblioteki wsparcia

getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_yourindicator);

Strzała z hitmana
źródło
5
Jeśli używasz szuflady, musisz zadzwonić drawerToggle.setDrawerIndicatorEnabled(false);przed zmianą wskaźnika
Floss
2
@Floss Dziękujemy, setDrawerIndicatorEnabled (false / true); rozwiązałem problem polegający na ustawieniu przycisku strony głównej jako spójnego „Wstecz” i (Otwórz szufladę / Zamknij szufladę) w oparciu o moje wymagania.
Ashraf Alshahawy
1
@Floss drawerToggle.setDrawerIndicatorEnabled (false); to działa dla mnie :)
Kontekst
30

Sprawdziłem pytanie. Oto kroki, które wykonuję. Kod źródłowy znajduje się na GitHub: https://github.com/jiahaoliuliu/sherlockActionBarLab

Zastąp rzeczywisty styl urządzeń starszych niż 11.

Skopiuj i wklej poniższy kod w pliku styles.xml folderu wartości domyślnych.

<resources>
    <style name="MyCustomTheme" parent="Theme.Sherlock.Light">
    <item name="homeAsUpIndicator">@drawable/ic_home_up</item>
    </style>
</resources>

Pamiętaj, że rodzic można zmienić na dowolny motyw Sherlocka.

Zastąp rzeczywisty styl urządzeń v11 +.

W tym samym folderze, w którym znajdują się wartości folderu, utwórz nowy folder o nazwie values-v11. Android automatycznie wyszuka zawartość tego folderu w przypadku urządzeń z interfejsem API lub nowszym.

Utwórz nowy plik o nazwie styles.xml i wklej następujący kod do pliku:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyCustomTheme" parent="Theme.Sherlock.Light">
    <item name="android:homeAsUpIndicator">@drawable/ic_home_up</item>
    </style>
</resources>

Pamiętaj, że nazwa stylu musi być taka sama jak plik w folderze wartości domyślnych, a zamiast elementu homeAsUpIndicator nazywa się android: homeAsUpIndicator.

Problem polega na tym, że w przypadku urządzeń z interfejsem API 11 lub nowszym pasek akcji Sherlock korzysta z domyślnego paska akcji dostarczanego z systemem Android, którego kluczową nazwą jest android: homeAsUpIndicator. Ale w przypadku urządzeń z API 10 lub niższym pasek akcji Sherlock wykorzystuje własny pasek ActionBar, który wskaźnik home up nazywa się prostym „homeAsUpIndicator”.

Użyj nowego motywu w manifeście

Zamień motyw aplikacji / działania w pliku AndroidManifest:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/MyCustomTheme" >
Jiahao
źródło
2
I możesz wypróbować @ drawable / abc_ic_ab_back_holo_light lub @ drawable / abc_ic_ab_back_holo_dark, jeśli szukasz już dostępnych ikon holo.
Mason Lee
25

Zmiana ikony nawigacji wstecz różni się dla ActionBar i paska narzędzi.

W przypadku atrybutu zastąpienia ActionBar homeAsUpIndicator:

<style name="CustomThemeActionBar" parent="android:Theme.Holo">
    <item name="homeAsUpIndicator">@drawable/ic_nav_back</item>
</style>

W przypadku navigationIconatrybutu zastąpienia paska narzędzi :

<style name="CustomThemeToolbar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="navigationIcon">@drawable/ic_nav_back</item>
</style>
duviteck
źródło
19

Zrobiłem poniższy kod onCreate()i pracowałem ze mną

getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_yourindicator);
Waleed A. Elgalil
źródło
5

Jeśli korzystasz z paska narzędzi Toolbar, nie potrzebujesz tych rozwiązań. Musisz tylko zmienić motyw paska narzędzi

app:theme="@style/ThemeOverlay.AppCompat.Light"

app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"

Jeśli używasz paska dark.actionBar, przycisk Wstecz będzie biały, a jeśli używasz jasnego motywu paska akcji, będzie czarny.

Oguz Ozcan
źródło
Twój kod działa dla mnie, ale czy możemy zmienić kolor tego wskaźnika?
Steve Luck
2
colorControlNormal i android: textColorSecondary wartości są za to odpowiedzialne, ale nie jestem pewien, co jeszcze te wartości również zmieniają. Możesz spróbować samodzielnie, definiując te wartości w motywie pasków narzędzi.
Oguz Ozcan
Używam „app: theme =" @ style / ThemeOverlay.AppCompat.Light "”, aby wyświetlić element nawigacji w kolorze białym, ale wyświetla domyślną szarą ikonę, muszę zmienić go na niebieski. „colorControlNormal i android: textColorSecondary” nie działa.
Steve Luck
2
Użyj niestandardowego motywu, który ma „ThemeOverlay.AppCompat.Light” jako element nadrzędny. To może zadziałać.
Oguz Ozcan
1
Znalazłem rozwiązanie zmiany ikony nawigacji, używając name = "colorControlNormal" not name = "android: colorControlNormal". Ale może chcę przejść na inną z możliwością rysowania?
Steve Luck,
2

podaj to:

getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close);

wewnątrz onCreate();

Abdurahman Popal
źródło
Działa, ale jak wrócić wcześniejszym przyciskiem wstecz
Nadimuddin
0

Użyłem obrazu back.png w pliku menifest.xml projektu. dobrze działa w projekcie.

<activity
        android:name=".YourActivity"
         android:icon="@drawable/back"
        android:label="@string/app_name" >
    </activity>
Kulwant Singh Bhari
źródło
0

Miałem ten sam problem z kierunkiem ikony przycisku na pasku akcji ze względu na brak zarządzania ikoną w ikonie katalogu zasobów Gradle

tak jak w katalogu zasobów Gradle arabskiego umieścisz ikonę w x-hdpi, a w języku angielskim Gradle zasób tę samą nazwę ikony umieściłeś w innym folderze gęstości, jak xx-hdpi, tak że w APK będą dwie takie same nazwy ikon w różnych katalogach, więc twoje urządzenie wybierz ikonę zależną od gęstości może być RTL lub LTR

użytkownik2508815
źródło