Cách thay đổi màu biểu tượng trang chủ của Thanh công cụ


108

Tôi đang sử dụng android.support.v7.widget.Toolbar và đã học được từ bài đăng này cách thay đổi màu của biểu tượng bánh hamburger thành màu trắng, nhưng mũi tên lên / quay lại vẫn là màu tối khi tôi gọi

setDisplayHomeAsUpEnabled(true);

Làm cách nào tôi có thể làm cho mũi tên trở nên trắng?

Đây là thanh công cụ của tôi trông như thế nào khi tôi gọi setDisplayHomeAsUpEnabled ():

nhập mô tả hình ảnh ở đây

... và đây là phần có liên quan của tệp styles.xml của tôi:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">#194C5F</item>
    <item name="colorAccent">@color/accent</item>
    <item name="drawerArrowStyle">@style/WhiteDrawerIconStyle</item>
</style>

    <style name="WhiteDrawerIconStyle" parent="Widget.AppCompat.DrawerArrowToggle">
        <item name="spinBars">true</item>
        <item name="color">@android:color/white</item>
    </style>

2
Bạn có thể sử dụng biểu tượng png mũi tên màu trắng và thay thế bằng biểu tượng màu đen.
Surender Kumar

1
Tôi đang cố gắng tránh điều đó và chỉ chỉ ra một màu sắc như một phong cách ... nếu đó là cách duy nhất tôi biết tôi có thể làm điều đó thông qua actionBarDrawerToggle.setHomeAsUpIndicator (R.drawable.arrow);
Joshua W

... cũng như png /com.android.support/appcompat-v7/21.0.3/res/drawable-xxxhdpi/abc_ic_ab_back_mtrl_am_alpha.png xuất hiện màu trắng
Joshua W

@JoshuaWitter Cảm ơn nó đã giải quyết được vấn đề của tôi, bạn cũng có thể vui lòng giúp tôi phát hiện nút bấm vào nút quay lại không? đây là câu hỏi của tôi stackoverflow.com/questions/29138629/…
user2056563

1
@JoshuaWitter ngay cả khi nó là màu trắng, nó bị ngả màu. Thay đổi colorControlNormalgiá trị
osrl Ngày

Câu trả lời:


242

Tôi đã giải quyết nó bằng cách chỉnh sửa styles.xml:

<style name="ToolbarColoredBackArrow" parent="AppTheme">
    <item name="android:textColorSecondary">INSERT_COLOR_HERE</item>
</style>

... sau đó tham chiếu đến kiểu trong định nghĩa Thanh công cụ trong hoạt động:

<LinearLayout
    android:id="@+id/main_parent_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/toolbar"
        app:theme="@style/ToolbarColoredBackArrow"
        app:popupTheme="@style/AppTheme"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="?attr/actionBarSize"
        android:background="?attr/colorPrimary"/>

13
Ngoài ra bạn có thể thiết lập colorControlNormalthay vìandroid:textColorSecondary
mbelsky

nhưng điều đó sẽ thay đổi toàn bộ màu của widget phải không? @mbelsky
Tiến sĩ aNdRO

3
@mbelsky Lưu ý rằng nó yêu cầu API cấp 21.
Francisco Romero

@ Error404: nó được thêm vào ở mức API 1 như u thấy ở đây
Mohamed Hatem Abdu

Xin chào tất cả, tôi đã thử mã của bạn nhưng tôi không nhận được kết quả cần thiết. Trong tệp toolbar.axml của tôi, tôi đang thiết lập chủ đề là android: theme=@style/ThemeOverlay.AppCompat.Dark.ActionBar và trong tệp styles.axml của tôi, tôi đã viết mã đã cho của bạn nhưng màu nút quay lại của thanh điều hướng không thay đổi.
Deepak

57

Đây là những gì bạn đang tìm kiếm. Nhưng điều này cũng làm thay đổi màu sắc của radioButton, v.v. Vì vậy, bạn có thể muốn sử dụng một chủ đề cho nó.

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

11
Đây phải là câu trả lời được chấp nhận. Điều này đạt được những gì tôi đang tìm kiếm: <style name = "ActionBarTheme" parent = "ThemeOverlay.AppCompat.Dark.ActionBar"> <item name = "colorControlNormal"> ### COLOR ### </item> </style> áp dụng chủ đề trực tiếp vào Thanh công cụ.
Mavamaarten

1
Thuộc tính cha rất quan trọng.
ataravati

36

Tôi đã giải quyết nó theo chương trình bằng cách sử dụng mã này:

final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
upArrow.setColorFilter(Color.parseColor("#FFFFFF"), PorterDuff.Mode.SRC_ATOP);
getSupportActionBar().setHomeAsUpIndicator(upArrow);

Bản sửa đổi 1:

Bắt đầu từ API 23 (Marshmallow), tài nguyên abc_ic_ab_back_mtrl_am_alphacó thể kéo được chuyển thành abc_ic_ab_back_material.


5
cũng đặt cái này. getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Ishan Fernando

Điều này sẽ hoạt động trong một Fragment? Nếu vậy, tôi sẽ đặt mã này vào đâu? Các OnCreateViewphương pháp, thư mục gốc của lớp, hay ...?
AndroidDevBro

1
@AndroidDevBro Có, chỉ cần đặt nó vào hàm OnCreate và nhớ cập nhật tài nguyên như Nouman Tahir đã viết trong bản sửa đổi (sử dụng R.drawable.abc_ic_ab_back_material thay vì R.drawable.abc_ic_ab_back_mtrl_am_alpha) và nhận SupportActionBar như sau: ((AppCompatActivity) getActivity ()). getSupportActionBar (). setHomeAsUpIndicator (upArrow);
PayToPwn

14

Câu trả lời này có thể là quá muộn, nhưng đây là cách tôi làm điều đó. Tạo kiểu cho thanh công cụ sẽ thực hiện thủ thuật. Tạo toolbar.xml với mã sau.

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:layout_alignParentTop="true"
android:layout_gravity="bottom"
local:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
local:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

và trong styles.xml

<style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!--
    -->
</style>

<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>

Cuối cùng, bao gồm thanh công cụ bên trong bố cục

<include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

1
nhưng AppTheme không được tham chiếu ở bất kỳ đâu. đây có phải là lỗi đánh máy không
Henry

11

Thay đổi Chủ đề Thanh công cụ của bạn thành ThemeOverlay.AppCompat.Dark

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimary"
    android:orientation="vertical"
    app:theme="@style/ThemeOverlay.AppCompat.Dark">

</android.support.v7.widget.Toolbar>

và đặt nó trong hoạt động

mToolbar = (Toolbar) findViewById(R.id.navigation);
setSupportActionBar(mToolbar);

1
Tôi đã rất ngạc nhiên về câu trả lời khác, tôi luôn luôn sử dụng phương pháp này
C. Skjerdal

9
   <!-- ToolBar -->
    <style name="ToolBarTheme.ToolBarStyle"    parent="ThemeOverlay.AppCompat.Dark.ActionBar">
        <item name="android:textColorPrimary">@android:color/white</item>
        <item name="android:textColor">@color/white</item>
        <item name="android:textColorPrimaryInverse">@color/white</item>
    </style>

Quá muộn để đăng, điều này đã làm cho tôi thay đổi màu của nút quay lại


8

Vâng, có một cách dễ dàng hơn để làm điều này

drawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.open_drawer, R.string.close_drawer);
arrow = drawerToggle.getDrawerArrowDrawable();

Và sau đó

arrow.setColor(getResources().getColor(R.color.blue);

7

Thay vì thay đổi kiểu, chỉ cần đặt hai dòng mã này vào hoạt động của bạn.

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.arrowleft);

6

Đây là giải pháp của tôi:

toolbar.navigationIcon?.mutate()?.let {
  it.setTint(theColor)
  toolbar.navigationIcon = it
}

Hoặc, nếu bạn muốn sử dụng một chức năng hay cho nó:

fun Toolbar.setNavigationIconColor(@ColorInt color: Int) = navigationIcon?.mutate()?.let {
    it.setTint(color)
    this.navigationIcon = it
}

Sử dụng:

toolbar.setNavitationIconColor(someColor)

Đây là câu trả lời hay nhất cho đến nay và nó giải quyết được vấn đề của tôi
Zaraki596

5

Mã này phù hợp với tôi:

public static Drawable changeBackArrowColor(Context context, int color) {
    String resName;
    int res;

    resName = Build.VERSION.SDK_INT >= 23 ? "abc_ic_ab_back_material" : "abc_ic_ab_back_mtrl_am_alpha";
    res = context.getResources().getIdentifier(resName, "drawable", context.getPackageName());

    final Drawable upArrow = context.getResources().getDrawable(res);
    upArrow.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);

    return upArrow;
}

...

getSupportActionBar().setHomeAsUpIndicator(changeBackArrowColor(this, Color.rgb(50, 50, 50)));               
supportInvalidateOptionsMenu();

Ngoài ra, nếu bạn muốn thay đổi màu văn bản của thanh công cụ:

Spannable spannableString = new SpannableString(t);
spannableString.setSpan(new ForegroundColorSpan(Color.rgb(50, 50, 50)), 0, t.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
toolbar.setText(spannableString);

Làm việc từ API 19 đến 25.


0

Thay vì sử dụng id có thể vẽ cũ hơn " abc_ic_ab_back_material ", hãy sử dụng id mới abc_ic_ab_back_material trong mọi phiên bản api. Tôi đã thử nghiệm nó vào năm 19, 21, 27 và hoạt động tốt với mã và cấu hình bên dưới.

  • minSdkVersion = 17
  • targetSdkVersion = 26
  • compileSdkVersion = 27

    public static Drawable changeBackArrowColor(Context context, int color) {
    int res;
    res = context.getResources().getIdentifier("abc_ic_ab_back_material", "drawable", context.getPackageName());
    if (res == 0)
        return null;
    final Drawable upArrow = ContextCompat.getDrawable(context, res);
    upArrow.setColorFilter(ContextCompat.getColor(context, color), PorterDuff.Mode.SRC_ATOP);
    
    return upArrow;

    }


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.