Thay đổi màu thanh trạng thái với AppCompat ActionBarActivity


145

Trong một trong các Hoạt động của mình, tôi đã thay đổi màu Thanh công cụ bằng cách sử dụng Palette. Nhưng trên 5,0 thiết bị sử dụng ActionBarActivitycác status barmàu sắc là màu sắc của tôi colorPrimaryDarktrong chủ đề hoạt động của tôi vì vậy tôi có 2 màu sắc rất khác nhau và nó không nhìn tốt.

Tôi nhận ra rằng trong 5.0 bạn có thể sử dụng Window.setStatusBarColor()nhưng ActionBarActivitykhông có cái này.

Vì vậy, câu hỏi của tôi là trong 5.0 làm thế nào tôi có thể thay đổi màu thanh trạng thái với ActionBarActivity?


Bạn đã thử sử dụng lib SystemBarTint chưa? github.com/jgilfelt/SystemBarTint
Nikola Despotoski

Câu trả lời:


419

Tôi không chắc là tôi hiểu vấn đề.

Tôi muốn thay đổi màu thanh trạng thái theo chương trình (và miễn là thiết bị có Android 5.0) thì bạn có thể sử dụng Window.setStatusBarColor(). Không nên tạo sự khác biệt cho dù hoạt động có nguồn gốc từ Activityhoặc ActionBarActivity.

Chỉ cần thử làm:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.setStatusBarColor(Color.BLUE);
}

Chỉ cần thử nghiệm điều này với ActionBarActivityvà nó hoạt động ổn.


Lưu ý: Việc đặt FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDScờ theo chương trình là không cần thiết nếu values-v21tệp kiểu của bạn đã được đặt, thông qua:

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>

1
ah ok Tôi không sử dụnggetWindow()
tyczj

điều này sẽ sụp đổ khi không tìm thấy mã LOLLIPOP trong các máy Android cũ. tốt nhất để sử dụng> = 21
mã511788465541441

12
@ code578841441 Thật ra, điều đó không nên xảy ra. Các hằng số được nội tuyến khi biên dịch.
matiash

4
@ code578841441: Đó là vì bạn đang biên dịch với SDK cũ hơn. Bạn phải luôn cố gắng biên dịch với SDK Android mới nhất, ngay cả khi bạn có các ràng buộc phiên bản API cũ hơn (tức là minSdkVersionvà / hoặc targetSdkVersioncác thuộc tính trên thành <uses-sdk ...>phần).
dbm

3
Tôi cũng đã phải gọi getWindow (). AddFlags (WindowManager.LayoutParams.FLAG_DRAWS_SYIUS_BAR_BACKGROUNDS); để làm cho nó hoạt động
Philipp E.

61

Có nhiều cách khác nhau để thay đổi màu thanh trạng thái.

1) Sử dụng tệp style.xml. Bạn có thể sử dụng thuộc tính android: statusBarColor để thực hiện việc này một cách dễ dàng nhưng tĩnh.

Lưu ý: Bạn cũng có thể sử dụng thuộc tính này với chủ đề Vật liệu.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

2) Bạn có thể hoàn thành nó một cách linh hoạt bằng cách sử dụng phương thức setStatusBarColor (int) trong lớp Window. Nhưng hãy nhớ rằng phương pháp này chỉ có sẵn cho API 21 trở lên. Vì vậy, hãy chắc chắn kiểm tra xem, hoặc ứng dụng của bạn chắc chắn sẽ gặp sự cố ở các thiết bị thấp hơn.

Dưới đây là một ví dụ làm việc của phương pháp này.

if (Build.VERSION.SDK_INT >= 21) {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(getResources().getColor(R.color.primaryDark));
}

trong đó chínhDark là 700 màu của màu chính tôi đang sử dụng trong ứng dụng của mình. Bạn có thể định nghĩa màu này trong tệp colors.xml.

Hãy thử và cho tôi biết nếu bạn có bất kỳ câu hỏi nào. Hy vọng nó giúp.


nó trông giống như window.clearFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); là không cần thiết - nhưng cái này hiệu quả với tôi
bkurzius

Bất cứ ý tưởng tại sao phiên bản lập trình sẽ hoạt động nhưng phiên bản phong cách không?
Andrew

Trong trường hợp của tôi, kiểu của hoạt động có tập flah translucent_status, do đó, không có lệnh window.clearFlags, nó không hoạt động. Vì vậy, cảm ơn bạn vì điều này!
BMaceso

Tuyệt vời! Điều này nên được chấp nhận câu trả lời, thêm clearFlagssửa chữa vấn đề của tôi
fanjavaid

9

Tôi không nghĩ màu thanh trạng thái đã được triển khai trong AppCompat. Đây là các thuộc tính có sẵn:

    <!-- ============= -->
    <!-- Color palette -->
    <!-- ============= -->

    <!-- The primary branding color for the app. By default, this is the color applied to the
         action bar background. -->
    <attr name="colorPrimary" format="color" />

    <!-- Dark variant of the primary branding color. By default, this is the color applied to
         the status bar (via statusBarColor) and navigation bar (via navigationBarColor). -->
    <attr name="colorPrimaryDark" format="color" />

    <!-- Bright complement to the primary branding color. By default, this is the color applied
         to framework controls (via colorControlActivated). -->
    <attr name="colorAccent" format="color" />

    <!-- The color applied to framework controls in their normal state. -->
    <attr name="colorControlNormal" format="color" />

    <!-- The color applied to framework controls in their activated (ex. checked) state. -->
    <attr name="colorControlActivated" format="color" />

    <!-- The color applied to framework control highlights (ex. ripples, list selectors). -->
    <attr name="colorControlHighlight" format="color" />

    <!-- The color applied to framework buttons in their normal state. -->
    <attr name="colorButtonNormal" format="color" />

    <!-- The color applied to framework switch thumbs in their normal state. -->
    <attr name="colorSwitchThumbNormal" format="color" />

(Từ \ sdk \ ngoại hạng \ android \ support \ v7 \ appcompat \ res \ value \ attrs.xml )


1
Có thể nó sẽ không bao giờ được triển khai trong AppCompat nếu các phiên bản HĐH cũ hơn không cung cấp bất kỳ khả năng nào để sửa đổi thanh trạng thái.
TheIT

2
<attr name = "colorPrimaryDark" format = "color" /> <! - Biến thể tối của màu thương hiệu chính. Theo mặc định, đây là màu được áp dụng cho thanh trạng thái (thông qua statusBarColor) và thanh điều hướng (thông qua navigationBarColor). ->
Soheil Setayeshi

3

Hãy thử điều này, tôi đã sử dụng nó và nó hoạt động rất tốt với v21.

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimaryDark">@color/blue</item>
</style>

1

Cảm ơn câu trả lời trên, với sự giúp đỡ của những người đó, sau khi R & D nhất định cho ứng dụng xamarin.android MVVMCross, bên dưới đã hoạt động

Cờ được chỉ định cho hoạt động trong phương thức OnCreate

protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        this.Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
    }

Đối với mỗi MvxActivity, Theme được đề cập như dưới đây

 [Activity(
    LaunchMode = LaunchMode.SingleTop,
    ScreenOrientation = ScreenOrientation.Portrait,
    Theme = "@style/Theme.Splash",
    Name = "MyView"
    )]

SplashStyle.xml của tôi trông như dưới đây

<?xml version="1.0" encoding="utf-8"?>
<resources> 
    <style name="Theme.Splash" parent="Theme.AppCompat.Light.NoActionBar">
          <item name="android:statusBarColor">@color/app_red</item>
          <item name="android:colorPrimaryDark">@color/app_red</item>
    </style>
 </resources>

Và tôi đã giới thiệu ứng dụng V7.


1

[Phiên bản Kotlin] Tôi đã tạo tiện ích mở rộng này cũng kiểm tra xem màu mong muốn có đủ độ tương phản để ẩn Giao diện người dùng hệ thống hay không, như Biểu tượng trạng thái pin, Đồng hồ, v.v., vì vậy chúng tôi đặt Giao diện người dùng màu trắng hoặc đen theo điều này.

fun Activity.coloredStatusBarMode(@ColorInt color: Int = Color.WHITE, lightSystemUI: Boolean? = null) {
    var flags: Int = window.decorView.systemUiVisibility // get current flags
    var systemLightUIFlag = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
    var setSystemUILight = lightSystemUI

    if (setSystemUILight == null) {
        // Automatically check if the desired status bar is dark or light
        setSystemUILight = ColorUtils.calculateLuminance(color) < 0.5
    }

    flags = if (setSystemUILight) {
        // Set System UI Light (Battery Status Icon, Clock, etc)
        removeFlag(flags, systemLightUIFlag)
    } else {
        // Set System UI Dark (Battery Status Icon, Clock, etc)
        addFlag(flags, systemLightUIFlag)
    }

    window.decorView.systemUiVisibility = flags
    window.statusBarColor = color
}

private fun containsFlag(flags: Int, flagToCheck: Int) = (flags and flagToCheck) != 0

private fun addFlag(flags: Int, flagToAdd: Int): Int {
    return if (!containsFlag(flags, flagToAdd)) {
        flags or flagToAdd
    } else {
        flags
    }
}

private fun removeFlag(flags: Int, flagToRemove: Int): Int {
    return if (containsFlag(flags, flagToRemove)) {
        flags and flagToRemove.inv()
    } else {
        flags
    }
}

0

Áp dụng

    <item name="android:statusBarColor">@color/color_primary_dark</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>

trong Theme.AppCompat.Light.DarkActionBarđã không làm việc cho tôi. Bí quyết là gì, đưa ra colorPrimaryDarknhư bình thường cùng với android:colorPrimarytrong tệp style.xml

<item name="android:colorAccent">@color/color_primary</item>
<item name="android:colorPrimary">@color/color_primary</item>
<item name="android:colorPrimaryDark">@color/color_primary_dark</item>

và trong thiết lập

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                {
                    Window window = this.Window;
                    Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
                }

không phải đặt màu thanh trạng thái trong mã.

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.