Thanh trạng thái chuyển sang màu trắng và không hiển thị nội dung đằng sau nó


96

Tôi đang dùng thử AppCompat trên Marshmallow. Và tôi muốn có một thanh trạng thái trong suốt nhưng nó chuyển sang màu trắng. Tôi đã thử một vài giải pháp nhưng chúng không hiệu quả với tôi ( Thanh trạng thái trong suốt không hoạt động với windowTranslucentNavigation = "false" , Lollipop: vẽ phía sau statusBar với màu của nó được đặt thành trong suốt ). Đây là mã liên quan.

Style.xml của tôi

<style name="Bacon" parent="Theme.Bacon"/>

<style name="Theme.Bacon" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/theme_primary</item>
    <item name="colorPrimaryDark">@color/theme_primary_dark</item>
    <item name="colorAccent">@color/theme_accent</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@color/background_material_light</item>  
</style>

<style name="Theme.Bacon.Detail" parent="Bacon"/>

v21

<style name="Bacon" parent="Theme.Bacon">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>

<style name="Theme.Bacon.Detail" parent="Bacon">
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

Hoạt động

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" />

</FrameLayout>

Miếng

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="192dp"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginBottom="32dp"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:statusBarScrim="@color/black_trans80">

        <ImageView
            android:id="@+id/photo"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:contentDescription="@string/photo"
            android:fitsSystemWindows="true"
            android:scaleType="centerCrop"
            app:layout_collapseMode="parallax" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/anim_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>

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


Bạn có thể giải quyết vấn đề này? Tôi gặp vấn đề tương tự. Trong một trong những hoạt động của tôi có thanh trạng thái màu trắng
kirtan403

1
@ kirtan403 Tôi đã khắc phục sự cố của mình bằng cách thay đổi bố cục Hoạt động của mình từ FrameLayout thành RelativeLayout. Hãy xem câu trả lời của tôi.
pt2121

Của tôi là tương đối chỉ vẫn nhận được thanh trạng thái màu trắng. Tôi đã đăng câu hỏi ở đây: stackoverflow.com/q/33890066/1820644
kirtan403

Sau một ngày đấu tranh, tôi đã tìm ra giải pháp phù hợp với mình. Dưới đây là câu trả lời: stackoverflow.com/a/33892569/1820644
kirtan403

Tôi đã thay đổi android: tình trạng windowTranslucentStatus false và làm việc của nó
Kiran Benny Joseph

Câu trả lời:


167

Tôi đã tìm thấy câu trả lời trong liên kết này: Màu thanh trạng thái không thay đổi với Bố cục tương đối làm phần tử gốc

Vì vậy, hóa ra chúng ta cần xóa

      <item name="android:statusBarColor">@android:color/transparent</item>

trong styles.xml (v21). Và nó hoạt động tốt cho tôi.


Vâng, đây là giải pháp. Vì android: fitSystemWindows sẽ gây ra sự cố khi làm cho thanh tab có thể cuộn được. Tìm thấy cùng một câu trả lời nhưng bạn đã đăng nó trước đó. Cũng đề cập rằng điều này được ghi đè mặc định, tôi nghĩ.
jobbert

Đây phải được đánh dấu là giải pháp được chấp nhận. Vấn đề này đang lan tràn khắp ứng dụng của tôi, giải pháp này đã khắc phục nó ở mọi nơi chỉ bằng cách nhận xét ra dòng duy nhất đó. Đã cứu tôi rất đau đầu!
BMB

Tôi đang sử dụng CoordinatorLayout, vì vậy câu trả lời khác cho chúng tôi là CoordinatorLayout vì thư mục gốc không hoạt động với tôi (sử dụng fitSystemWindows = true như đã đề xuất cũng không hoạt động). Câu trả lời này phù hợp với tôi.
Bruce

Điều gì sẽ xảy ra nếu tôi yêu cầu màu thanh trạng thái của mình phải trong suốt?
nullmn

1
@nullmn thì bạn cần thay đổi nền Hoạt động của mình thành một thứ khác.
Phoenix Wang

96

(Đến bữa tiệc hơi muộn nhưng nó có thể giúp ích cho ai đó)

Tôi cũng có chính xác vấn đề đấy. Bằng cách nào đó, một số hoạt động diễn ra bình thường trong khi những hoạt động mới tôi tạo hiển thị thanh trạng thái màu trắng thay vì colorPrimaryDarkgiá trị.

Sau khi thử một số mẹo, tôi nhận thấy rằng các hoạt động hoạt động bình thường trong đó tất cả sử dụng CoordinatorLayoutlàm gốc của bố cục, trong khi đối với những người khác, tôi đã thay thế nó bằng bố cục thông thường vì tôi không cần các tính năng (hoạt ảnh, v.v.) được cung cấp bởi CoordinatorLayout.

Vì vậy, giải pháp là tạo CoordinatorLayoutbố cục gốc, và sau đó bên trong nó thêm gốc bố cục cũ của bạn. Đây là một ví dụ:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:fitsSystemWindows="true">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <!-- your activity content here-->


  </LinearLayout>
</android.support.design.widget.CoordinatorLayout>

XIN LƯU Ý rằng nếu không có android:fitsSystemWindows="true"giải pháp này không hiệu quả với tôi.

Đã thử nghiệm trên Lollipop và Marshmallow


3
Giải pháp đã làm việc cho tôi quá. Nhưng .. tại sao nó lại xảy ra? Thích màu Statusbar được hiển thị khi gốc là DrawerLayout hoặc CoordinatorLayout
user3316561

3
Điều này chỉ hoạt động với tôi khi thêm android:fitsSystemWindows="true"vào CoordinatorLayouttrong Android 8.
Franco

2
@Franco Tôi nghĩ đây là phần phù hợp nhất của giải pháp. Tôi nói điều này vì tôi đã có CoordinatorLayoutkhi tôi gặp phải sự cố tương tự và tài sản cụ thể mà cố định này đối với tôi làandroid:fitsSystemWindows="true"
Wilhelm

Các android:fitsSystemWindows="true"không làm việc cho tôi. Điều đã giải quyết được vấn đề của tôi là sử dụng chủ đề không có AppTheme.NoActionBartrong hoạt động với a CoordinatorLayout. Tôi không biết tại sao điều đó đã sửa nó.
bmdelacruz

CoordinatorLayouthoặc android:fitsSystemWindows="true"không phải là làm việc cho tôi.
Alif Hasnain

17
 <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@color/colorPrimaryDark</item>
    </style

Chỉ cần Thay thế cái này, statusBarColor phải là màu bạn mong đợi chứ không phải là TRANSPARENT


17

Bạn phải thêm thuộc tính này vào phong cách của mình để xem nội dung

<item name="android:windowLightStatusBar" tools:ignore="NewApi">true</item>

Điều này đã làm việc cho tôi. Điều này nên được chấp nhận câu trả lời.
Abdul rehman

11

Thêm cái này vào style.xml của bạn

    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>

và điều này trong onCreate () của bạn;

 getWindow().getDecorView().setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

1
Cảm ơn nhưng điều này không hoạt động. Thanh trạng thái trông giống nhau.
pt2121

xin vui lòng giúp đỡ cho vấn đề này ... cùng một vấn đề ở đây .... không ai trong số các giải pháp cho đến bây giờ làm việc
Saeed Jassani

@SaeedJassani Tôi đã tìm thấy một giải pháp phù hợp với tôi. Nếu bạn có cùng một vấn đề có một cái nhìn vào câu hỏi và câu trả lời của tôi: stackoverflow.com/a/33892569/1820644
kirtan403

9

Sau khi thử tất cả các cách trên không thành công, tôi thấy rằng việc đặt chủ đề một cách rõ ràng đã khắc phục được sự cố.

setTheme(R.style.AppTheme);

Điều đó phải đi trước super.OnCreate () trong hoạt động của bạn.


1
Tôi có thể xác nhận rằng điều này đã sửa lỗi hoạt động sai trên Marshmallow
dám0021

yêu bạn người đàn ông, làm việc như một sự quyến rũ, mặc dù tôi vẫn không biết tại sao: @
Adeel Ahmad

trước super.OnCreate () là chìa khóa
Karthik Rk

9

Chỉ cần đặt mục này vào v21 \ styles.xml của bạn:

thật

Nó sẽ giống như thế này :

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>


1
Nó hoạt động đối với tôi khi sử dụng falsecác giá trị trong 2 mục cuối cùng. Kỳ lạ, nhưng cảm ơn.
JCarlosR

Nó chỉ hoạt động với hai dòng cuối cùng nhưng nội dung nằm sau thanh trạng thái, padding / margin hoặc fitSystemWindows không giúp được gì. Đã thử nghiệm trên OP 5 đang chạy kẹo hạnh nhân
Anton Makov

9

Tôi phải đối mặt với cùng một vấn đề. Điều tôi đã làm là, trong tệp "v21 / styles.xml", a đã thay đổi giá trị true:

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

đến:

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


5

Tôi đã khắc phục sự cố của mình bằng cách thay đổi bố cục Hoạt động của mình từ FrameLayout thành RelativeLayout. Cảm ơn mọi người đã cố gắng giúp đỡ!

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@android:color/transparent">

    <android.support.v4.view.ViewPager
      android:id="@+id/pager"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@color/theme_primary_dark"
      android:fitsSystemWindows="true" />

</RelativeLayout>

Hãy thử phân cấp-xem hoặc ViewIns Inspector . Những công cụ này có thể giúp bạn.


5

Chỉ cần xóa thẻ sau khỏi style v21 @android: color / transparent

Điều này làm việc cho tôi.


@android: màu / trong suốt không phải là "thẻ". Nó có thể là giá trị của một thuộc tính style, nhưng nó không phải là một "thẻ". Điều gì sẽ xảy ra nếu OP có giá trị này được xác định nhiều lần? Anh ta nên xóa cái nào? Câu trả lời của bạn là quá chung chung.
được bảo vệ

vâng, đó cũng là trường hợp của tôi .. cảm ơn bạn, Shendre! :) và cho nhận xét của bạn, @protectedmember - Hệ điều hành không có giới tính.
zeroDivider

3

Cách tiếp cận tốt hơn

Kiểm tra tệp style.xml của bạn nơi chủ đề NoActionBar của bạn ở đó. Đảm bảo rằng nó có cha mẹ là Theme.AppCompat.NoActionBar và cũng có thể tùy chỉnh nó bằng cách thêm bảng màu của bạn. Cuối cùng, đặt các chủ đề của bạn trong tệp kê khai theo yêu cầu.

Dưới đây là mẫu tệp styles.xml của tôi (ActionBar + NoActionBar).

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<!-- No ActionBar application theme. -->
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

2

Đối với tôi, nó hoạt động bằng cách làm như sau:

  1. Đặt chủ đề .NoActionBar
  2. Bao bọc Thanh công cụ trong android.support.design.widget.AppBarLayout
  3. Làm android.support.design.widget.CoordinatorLayoutnhư bố cục mẹ.

Về cơ bản, nó là bước thứ ba vẽ thanh trạng thái, colorPrimaryDarknếu không nó sẽ không được vẽ nếu bạn sử dụng NoActionBarchủ đề. Bước thứ 2 sẽ cung cấp cho thanh công cụ của bạn lớp phủ .


2

Đối với phong cách v23

 <style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowLightStatusBar">true</item>
    <item name="android:statusBarColor">@android:color/white</item>
</style>

Đối với phong cách v21

<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/white</item>
</style>

2

[Đầu ra]

Mở rộng thư mục res -> values ​​-> styles từ bảng điều khiển dự án.

Mở styles.xml (v21)

SỬ DỤNG BẤT KỲ MỘT CÁCH NÀO TỪ CÁC CÁCH DƯỚI ĐÂY

  1. Thay đổi true thành false trong thuộc android:windowDrawsSystemBarBackgroundstính.
  2. Thay đổi @android: color / transparent thành @ color / colorPrimaryDark trong thuộc android:statusBarColortính.
  3. Xóa android:statusBarColordòng thích hợp.

2

Nếu v21 / styles.xml của bạn chứa

<resources>
    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

Sau đó, Xóa hoặc nhận xét bên dưới dòng hoặc thay đổi màu sắc của thanh trạng thái,

<item name="android:statusBarColor">@android:color/transparent</item>

Nó hoạt động tốt. Hy vọng điều này là hữu ích. Cảm ơn.


2

Tôi đã tìm ra giải pháp cho điều này -

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowLightStatusBar">true</item>
</style>

thêm điều này vào phong cách của bạn và nó sẽ hoạt động cho api 21 trở lên.


1

Tôi không chắc liệu có muộn không nhưng tôi hy vọng nó sẽ giúp ích cho ai đó. * Tạo chế độ xem giả với nền trong suốt phù hợp với bố cục và tạo một trình điều phối làm phần tử bố cục gốc của bạn.

<View
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:fitsSystemWindows="true" />


<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:scaleType="centerCrop"
    android:src="@drawable/something" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   .... YOUR LAYOUT


1

Điều này có tác dụng với tôi

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }

1
Xin chào, chào mừng bạn đến với StackOverflow! Bạn có thể chỉnh sửa câu trả lời của mình để giải thích rõ hơn tại sao câu trả lời này hoạt động được không? Giải thích ngắn gọn về mã của bạn sẽ giúp bạn đi một chặng đường dài!
Gigazelle

0

Tôi đoán rằng điều này là do bạn android:windowBackground. Là @color/background_material_lightmột tham chiếu đến màu trắng?


Không. Nó chắc chắn không phải màu trắng nhưng dù sao cũng cảm ơn! (Bạn có thể thấy các biểu tượng màu trắng trên đó.)
pt2121

Tôi đã đọc nhầm câu hỏi của bạn. Hãy thử thay thế <item name="android:statusBarColor">@android:color/transparent</item>bằng <item name="android:statusBarColor">@null</item>.
hanspeide

Để đảm bảo rằng tôi hiểu chính xác về bạn, bạn có muốn hình ảnh được hiển thị phía sau thanh trạng thái không?
hanspeide

0

Kiểm tra Thanh công cụ này chuyển sang màu trắng - AppBar không được vẽ sau khi cuộn khỏi màn hình

https://code.google.com/p/android/issues/detail?id=178037#c19

Tôi đang sử dụng thư viện 23.0.0. và lỗi vẫn xảy ra.

Giải pháp cho việc này là thêm Chế độ xem gần như không tốn dung lượng và có thể ẩn. Xem cấu trúc bên dưới.

<android.support.v4.widget.NestedScrollView
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</android.support.v4.widget.NestedScrollView>

<android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.Toolbar
        app:layout_scrollFlags="scroll|enterAlways" />

    <android.support.design.widget.TabLayout
        app:layout_scrollFlags="scroll|enterAlways" />

    <View
        android:layout_width="match_parent"
        android:layout_height=".3dp"
        android:visibility="visible"/>

</android.support.design.widget.AppBarLayout>

Câu hỏi này trên Stackoverflow.com cũng đề cập đến lỗi này: Thanh công cụ CoordinatorLayout ẩn khi nhập cho đến khi có chiều cao đầy đủ AppBarLayout - Bố cục đôi khi ẩn khi nó vào chế độ xem (ngay cả khi nó không được nhập)


nó không phải là cùng một lỗi. trong trường hợp của tôi, nó có màu trắng ngay sau khi hoạt động hiển thị không phải sau khi được cuộn ra khỏi màn hình. dù sao cũng cảm ơn
pt2121 18/11/15

0

Nếu bạn đang sử dụng RelativeLayout / CoordinatorLayout thì đây là giải pháp phù hợp với tôi:

Bạn phải sử dụng

  • CoordinatorLayout
  • AppBarLayout

Nhắc lại để sử dụng CoordinatorLayout thay vì RelativeLayout (hiệu suất tốt hơn và hoạt động hoàn hảo với AppBarLayout)

Đây là cách phân đoạn của bạn sẽ bắt đầu

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_light"
android:fitsSystemWindows="true"
>

<android.support.design.widget.AppBarLayout
    android:id="@+id/main.appbar"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:fitsSystemWindows="true"
    >
    ...

Mã hóa tốt!


0
 <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

thêm mục 'windowTranslucentStatus' trong các kiểu


0

Thêm cái này vào style.xml của bạn

<item name="android:windowTranslucentStatus">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>

Lưu ý: Màu thanh trạng thái không được hỗ trợ dưới API cấp 21.


-1
    Window window = this.getWindow();
    window.setStatusBarColor(this.getResources().getColor(R.color.colorPrimaryDark));

Thêm 2 dòng này vào tệp java bên dưới


1
Chào mừng bạn đến với Stack Overflow. Bạn có thể vui lòng giải thích cách đoạn mã của bạn hoạt động và nó giúp giải quyết câu hỏi OPs như thế nào? Hãy tham khảo cách viết câu trả lời hay để cải thiện câu trả lời của bạn
Tom 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.