Jak zmienić kolor tylnej strzałki w nowym temacie materiału?

Zaktualizowałem moje SDK do API 21, a teraz ikona back/up to czarna strzałka skierowana w lewo.

Czarna strzałka w tył

Chciałbym, żeby była szara. Jak mogę to zrobić? Na przykład w Sklepie Play strzałka jest biała.

Zrobiłem to, aby ustawić kilka stylów. Użyłem @drawable/abc_ic_ab_back_mtrl_am_alpha dla homeAsUpIndicator. Ten drawable jest przezroczysty (tylko alfa), ale strzałka jest wyświetlana na czarno. Zastanawiam się, czy mogę ustawić kolor tak jak w DrawerArrowStyle. Lub jeśli jedynym rozwiązaniem jest stworzenie mojego {[4] } i użyj go do homeAsUpIndicator.

<!-- Base application theme -->
<style name="AppTheme" parent="Theme.AppCompat.Light">

    <item name="android:actionBarStyle" tools:ignore="NewApi">@style/MyActionBar</item>
    <item name="actionBarStyle">@style/MyActionBar</item>

    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>

    <item name="homeAsUpIndicator">@drawable/abc_ic_ab_back_mtrl_am_alpha</item>
    <item name="android:homeAsUpIndicator" tools:ignore="NewApi">@drawable/abc_ic_ab_back_mtrl_am_alpha</item>
</style>

<!-- ActionBar style -->
<style name="MyActionBar" parent="@style/Widget.AppCompat.Light.ActionBar.Solid">

    <item name="android:background">@color/actionbar_background</item>
    <!-- Support library compatibility -->
    <item name="background">@color/actionbar_background</item>
</style>

<!-- Style for the navigation drawer icon -->
<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="spinBars">true</item>
    <item name="color">@color/actionbar_text</item>
</style>

Moim dotychczasowym rozwiązaniem było wzięcie @drawable/abc_ic_ab_back_mtrl_am_alpha, który wydaje się być biały, i pomalowanie go w Kolorze, jakiego Pragnę za pomocą edytora zdjęć. Działa, chociaż wolałbym użyć @color/actionbar_text jak w DrawerArrowStyle.

Author: Vivek Barai, 2014-11-06

20 answers

Możesz to osiągnąć za pomocą kodu. Uzyskaj strzałkę wstecz, którą można narysować, zmodyfikuj jej kolor za pomocą filtra i ustaw go jako przycisk Wstecz.

final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
upArrow.setColorFilter(getResources().getColor(R.color.grey), PorterDuff.Mode.SRC_ATOP);
getSupportActionBar().setHomeAsUpIndicator(upArrow);

Rewizja 1:

Począwszy od API 23 (Marshmallow) zasób drawable abc_ic_ab_back_mtrl_am_alpha jest zmieniany na abc_ic_ab_back_material.

EDIT:

Możesz użyć tego kodu, aby osiągnąć pożądane wyniki:

toolbar.getNavigationIcon().setColorFilter(getResources().getColor(R.color.blue_gray_15), PorterDuff.Mode.SRC_ATOP);
 305
Author: Carles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-23 12:51:23

Patrząc na źródło Toolbar i TintManager, drawable/abc_ic_ab_back_mtrl_am_alpha jest przyciemnione wartością atrybutu style colorControlNormal.

Próbowałem ustawić to w moim projekcie( z <item name="colorControlNormal">@color/my_awesome_color</item> w moim temacie), ale nadal jest dla mnie czarny.

Update :

Znalazłem. Musisz ustawić atrybut actionBarTheme (Nie actionBarStyle) z colorControlNormal.

Eg:

<style name="MyTheme" parent="Theme.AppCompat.Light">        
    <item name="actionBarTheme">@style/MyApp.ActionBarTheme</item>
    <item name="actionBarStyle">@style/MyApp.ActionBar</item>
    <!-- color for widget theming, eg EditText. Doesn't effect ActionBar. -->
    <item name="colorControlNormal">@color/my_awesome_color</item>
    <!-- The animated arrow style -->
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
</style>

<style name="MyApp.ActionBarTheme" parent="@style/ThemeOverlay.AppCompat.ActionBar">       
    <!-- THIS is where you can color the arrow! -->
    <item name="colorControlNormal">@color/my_awesome_color</item>
</style>

<style name="MyApp.ActionBarStyle" parent="@style/Widget.AppCompat.Light.ActionBar">
    <item name="elevation">0dp</item>      
    <!-- style for actionBar title -->  
    <item name="titleTextStyle">@style/ActionBarTitleText</item>
    <!-- style for actionBar subtitle -->  
    <item name="subtitleTextStyle">@style/ActionBarSubtitleText</item>

    <!-- 
    the actionBarTheme doesn't use the colorControlNormal attribute
    <item name="colorControlNormal">@color/my_awesome_color</item>
     -->
</style>
 182
Author: rockgecko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-22 01:21:32

Wypróbowałem wszystkie sugestie powyżej. Jedynym sposobem, w jaki udało mi się zmienić kolor ikony nawigacji domyślną strzałkę przycisku Wstecz w moim pasku narzędzi jest ustawienie colorControlNormal w motywie bazowym w ten sposób. Prawdopodobnie ze względu na fakt, że rodzic używa motywu.AppCompat.Światło.NoActionBar

<style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="colorControlNormal">@color/white</item> 
  //the rest of your codes...
</style>
 102
Author: Harry Aung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-15 09:17:44

Trzeba dodać pojedynczy atrybut do motywu paska narzędzi -

<style name="toolbar_theme" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="colorControlNormal">@color/arrow_color</item>
</style>

Zastosuj ten pasek narzędzi_theme na pasku narzędzi.

Lub

Możesz bezpośrednio zastosować do swojego motywu -

<style name="CustomTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="colorControlNormal">@color/arrow_color</item> 
  //your code ....
</style>
 56
Author: Neo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-01 10:30:20

Po prostu dodaj

<item name="colorControlNormal">@color/white</item> 

Do aktualnego motywu aplikacji.

 42
Author: S bruce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 14:32:02

Jak wspomniano w większości poprzednich komentarzy, rozwiązaniem jest dodanie

<item name="colorControlNormal">@color/white</item> do motywu aplikacji. Ale potwierdź, że nie masz innego motywu zdefiniowanego w elemencie paska narzędzi w układzie.

     <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            android:elevation="4dp"
            android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
 29
Author: manuelvsc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-15 10:07:00

Jeśli używasz Toolbar, Możesz spróbować tego

Drawable drawable = toolbar.getNavigationIcon();
drawable.setColorFilter(ContextCompat.getColor(appCompatActivity, colorId), PorterDuff.Mode.SRC_ATOP);
 25
Author: longbaobao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-19 09:59:08

Odpowiedź Carlesa jest poprawna, ale kilka metod jak getDrawable (), getColor () został przestarzały w momencie pisania tej odpowiedzi. Więc zaktualizowaną odpowiedzią będzie

Drawable upArrow = ContextCompat.getDrawable(context, R.drawable.abc_ic_ab_back_mtrl_am_alpha);
upArrow.setColorFilter(ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_ATOP);
getSupportActionBar().setHomeAsUpIndicator(upArrow);

Po kilku innych zapytaniach stackoverflow stwierdziłem, że wywołanie ContextCompat.getDrawable() jest podobny do

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

I ContextCompat.getColor () {[7] } jest podobny do

public static final int getColor(Context context, int id) {
    final int version = Build.VERSION.SDK_INT;
    if (version >= 23) {
        return ContextCompatApi23.getColor(context, id);
    } else {
        return context.getResources().getColor(id);
    }
}

Link 1: ContextCompat.getDrawable()

Link 2: ContextCompat.getColor()

 10
Author: capt.swag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:38

Na kompilacjidkversoin 25, możesz to zrobić:

Style.xml

<style name="AppTheme" parent="Theme.AppCompat.Light">
     <item name="android:textColorSecondary">@color/your_color</item>
</style>
 7
Author: nuttynibbles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 08:00:15

Tutaj wpisz opis obrazka

Zmień Kolor Ikony Menu Nav

Ostateczna konwersja kolor ikony Menu

W stylu.xml:

<style name="MyMaterialTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
    <item name="android:textColor">@color/colorAccent</item>


</style>

<style name="DrawerArrowStyle" parent="@style/Widget.AppCompat.DrawerArrowToggle">
    <item name="spinBars">true</item>
    <item name="color">@color/colorPrimaryDark</item>
</style>







In Mainfests.xml :

<activity android:name=".MainActivity"
        android:theme="@style/MyMaterialTheme.Base"></activity>
 6
Author: Sumit Saxena,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 07:33:27

Znalazłem rozwiązanie, które działa przed lizakiem. Ustaw "colorControlNormal" w "actionBarWidgetTheme", aby zmienić kolor wskaźnika homeAsUpIndicator. Modyfikowanie odpowiedzi rockgecko z góry tak aby wyglądała tak:

<style name="MyTheme" parent="Theme.AppCompat.Light">        
    <item name="actionBarTheme">@style/MyApp.ActionBarTheme</item>
    <item name="actionBarStyle">@style/MyApp.ActionBar</item>
    <!-- color for widget theming, eg EditText. Doesn't effect ActionBar. -->
    <item name="colorControlNormal">@color/my_awesome_color</item>
    <!-- The animated arrow style -->
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
    <!-- The style for the widgets on the ActionBar. -->
    <item name="actionBarWidgetTheme">@style/WidgetStyle</item>
</style>

<style name="WidgetStyle" parent="style/ThemeOverlay.AppCompat.Light">
    <item name="colorControlNormal">@color/my_awesome_color</item>
</style>
 5
Author: GFred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-18 04:13:50

Użyj poniższej metody:

private Drawable getColoredArrow() {
    Drawable arrowDrawable = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
    Drawable wrapped = DrawableCompat.wrap(arrowDrawable);

    if (arrowDrawable != null && wrapped != null) {
        // This should avoid tinting all the arrows
        arrowDrawable.mutate();
        DrawableCompat.setTint(wrapped, Color.GRAY);
    }

    return wrapped;
}

Teraz możesz ustawić drawable za pomocą:

getSupportActionBar().setHomeAsUpIndicator(getColoredArrow());
 5
Author: Jumpa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-08 13:37:42

Innym rozwiązaniem, które może zadziałać dla Ciebie, jest nie deklarowanie paska narzędzi jako paska akcji aplikacji ( przez setActionBar lub setSupportActionBar) i ustawić ikonę z powrotem w onActivityCreated za pomocą kodu wymienionego w innej odpowiedzi na tej stronie

final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
upArrow.setColorFilter(getResources().getColor(R.color.grey), PorterDuff.Mode.SRC_ATOP);
toolbar.setNavigationIcon(upArrow);

Teraz, nie dostaniesz onOptionItemSelected oddzwonienie po naciśnięciu przycisku Wstecz. Możesz jednak zarejestrować się w tym celu używając setNavigationOnClickListener. To właśnie robię:

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        getActivity().onBackPressed(); //or whatever you used to do on your onOptionItemSelected's android.R.id.home callback
    }
});

Nie jestem pewien, czy to zadziała, jeśli pracujesz z elementami menu.

 4
Author: Vinay Wadhwa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-07 23:24:05

Mieliśmy ten sam problem i chcieliśmy tylko ustawić

Aplikacja: collapseIcon

Atrybut w pasku narzędzi na końcu, którego nie znaleźliśmy, ponieważ nie jest zbyt dobrze udokumentowany:)

<android.support.v7.widget.Toolbar
         android:id="@+id/toolbar"
         android:layout_width="match_parent"
         android:layout_height="@dimen/toolbarHeight"
         app:collapseIcon="@drawable/collapseBackIcon" />
 1
Author: Julian Horst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 13:19:26

Spróbuj tego

public void enableActionBarHomeButton(AppCompatActivity appCompatActivity, int colorId){

    final Drawable upArrow = ContextCompat.getDrawable(appCompatActivity, R.drawable.abc_ic_ab_back_material);
    upArrow.setColorFilter(ContextCompat.getColor(appCompatActivity, colorId), PorterDuff.Mode.SRC_ATOP);

    android.support.v7.app.ActionBar mActionBar = appCompatActivity.getSupportActionBar();
    mActionBar.setHomeAsUpIndicator(upArrow);
    mActionBar.setHomeButtonEnabled(true);
    mActionBar.setDisplayHomeAsUpEnabled(true);
}

Wywołanie funkcji:

enableActionBarHomeButton(this, R.color.white);
 1
Author: Siddarth Kanted,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-24 11:34:43

Możesz programowo zmienić kolor ikony nawigacji w następujący sposób:

mToolbar.setNavigationIcon(getColoredArrow()); 

private Drawable getColoredArrow() {
        Drawable arrowDrawable = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        Drawable wrapped = DrawableCompat.wrap(arrowDrawable);

        if (arrowDrawable != null && wrapped != null) {
            // This should avoid tinting all the arrows
            arrowDrawable.mutate();
                DrawableCompat.setTintList(wrapped, ColorStateList.valueOf(this.getResources().getColor(R.color.your_color)));
            }
        }

        return wrapped;
}
 0
Author: pks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-28 07:07:38

Po prostu usuń android:homeAsUpIndicator i homeAsUpIndicator ze swojego tematu i będzie dobrze. Atrybut color w Twoim stylu DrawerArrowStyle musi być wystarczający.

 -1
Author: Flávio Faria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-06 20:37:55

Jeśli chcesz zmienić kolor przycisku strzałki dla wszystkich ikon w szablonie, po prostu Nadpisz domyślny plik w folderze do rysowania. Domyślna nazwa pliku to " abc_ic_ab_back_mtrl_am_alpha.png".

 -1
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-10 12:00:35

Właśnie zmieniłem motyw paska narzędzi na @style / ThemeOverlay.AppCompat.Światło

I strzała stała się ciemnoszara

            <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:gravity="center"
            app:layout_collapseMode="pin"
            app:theme="@style/ThemeOverlay.AppCompat.Light">
 -1
Author: fullMoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-02 06:26:39

Chyba, że jest lepsze rozwiązanie...

To, co zrobiłem, to zrobienie @drawable/abc_ic_ab_back_mtrl_am_alpha zdjęć, które wydają się być białe, i pomalowanie ich w pożądany kolor za pomocą edytora zdjęć.

 -4
Author: Ferran Maylinch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-08 19:38:18