Bilah status menjadi putih dan tidak menampilkan konten di belakangnya

98

Saya mencoba AppCompat di Marshmallow. Dan saya ingin memiliki bilah status transparan namun berubah menjadi putih. Saya telah mencoba beberapa solusi tetapi tidak berhasil untuk saya ( Status bar transparan tidak berfungsi dengan windowTranslucentNavigation = "false" , Lollipop: menggambar di belakang statusBar dengan warna disetel ke transparan ). Berikut kode terkait.

Styles.xml saya

<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>

Aktivitas

<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>

Pecahan

<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>

masukkan deskripsi gambar di sini

pt2121
sumber
Apakah Anda dapat mengatasi masalah ini? Saya mengalami masalah yang sama. Dalam salah satu aktivitas saya memiliki status bar putih
kirtan403
1
@ kirtan403 Saya memperbaiki masalah saya dengan mengubah tata letak Aktivitas saya dari FrameLayout ke RelativeLayout. Silakan lihat jawaban saya.
pt2121
Milik saya Relatif hanya masih mendapatkan bilah status putih. Saya telah memposting pertanyaan di sini: stackoverflow.com/q/33890066/1820644
kirtan403
Setelah berjuang selama sehari, saya menemukan solusi yang berhasil untuk saya. Inilah jawabannya: stackoverflow.com/a/33892569/1820644
kirtan403
Saya mengubah status android: windowTranslucentStatus menjadi false dan berfungsi
Kiran Benny Joseph

Jawaban:

167

Saya menemukan jawabannya di tautan ini: Status Bar Color tidak berubah dengan Relative Layout sebagai elemen root

Jadi ternyata kita perlu menghapus file

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

di styles.xml (v21). Dan itu bekerja dengan baik untuk saya.

Phoenix Wang
sumber
Ya, inilah solusinya. Karena android: fitSystemWindows akan menyebabkan masalah saat membuat bilah tab dapat di-scroll. Menemukan jawaban yang sama tetapi Anda mempostingnya sebelumnya. Juga sebutkan bahwa ini adalah default yang ditimpa menurut saya.
jobbert
Ini harus ditandai sebagai solusi yang diterima. Masalah ini merayap di seluruh aplikasi saya, solusi ini memperbaikinya di mana-mana hanya dengan mengomentari satu baris itu. Menyelamatkan saya dari sakit kepala!
BMB
Saya menggunakan CoordinatorLayout, jadi jawaban lain untuk kami CoordinatorLayout sebagai root tidak berfungsi untuk saya (menggunakan fitSystemWindows = true seperti yang disarankan juga tidak berfungsi). Jawaban ini berhasil untuk saya.
Bruce
Bagaimana jika saya meminta warna bilah status saya transparan?
nullmn
1
@nullmn maka Anda perlu mengubah latar belakang Aktivitas Anda ke sesuatu yang lain.
Phoenix Wang
96

(Sedikit terlambat ke pesta tapi mungkin bisa membantu seseorang)

Saya memiliki masalah yang sama persis. Entah bagaimana, beberapa aktivitas normal sementara aktivitas baru yang saya buat menampilkan bilah status putih, bukancolorPrimaryDark nilai.

Setelah mencoba beberapa tips, saya menemukan bahwa aktivitas kerja normal semua menggunakan CoordinatorLayoutsebagai root dari layout, sedangkan untuk yang lain saya menggantinya dengan layout biasa karena saya tidak membutuhkan fitur (animasi, dll) yang disediakan oleh CoordinatorLayout.

Jadi solusinya adalah membuat CoordinatorLayouttata letak root, lalu di dalamnya tambahkan root tata letak sebelumnya. Berikut ini contohnya:

<?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>

HARAP DICATAT bahwa tanpa android:fitsSystemWindows="true"solusi ini tidak berhasil untuk saya.

Diuji di Lollipop dan Marshmallow

Mauro Banze
sumber
3
Solusinya juga berhasil untuk saya. Tapi .. kenapa itu bisa terjadi? Warna StatusBar yang tepat ditampilkan ketika root adalah DrawerLayout atau CoordinatorLayout
user3316561
3
Ini hanya bekerja untuk saya ketika menambahkan android:fitsSystemWindows="true"ke CoordinatorLayoutdalam Android 8.
Franco
2
@Franco Saya rasa ini adalah bagian paling relevan dari solusi. Saya mengatakan ini karena saya mengalami CoordinatorLayoutketika saya mengalami masalah yang sama dan properti khusus yang memperbaikinya untuk saya adalahandroid:fitsSystemWindows="true"
Wilhelm
Itu android:fitsSystemWindows="true"tidak berhasil untuk saya. Apa yang memecahkan masalah saya adalah menggunakan tema yang tidak ada AppTheme.NoActionBardalam aktivitas dengan file CoordinatorLayout. Saya tidak tahu mengapa itu memperbaikinya.
bmdelacruz
CoordinatorLayoutatau android:fitsSystemWindows="true"tidak ada yang berhasil untuk saya.
Alif Hasnain
18
 <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

Ganti saja ini, statusBarColor harus menjadi warna yang Anda harapkan dan bukan TRANSPARENT

Shrini Jaiswal
sumber
17

Anda harus menambahkan properti ini pada gaya Anda untuk melihat konten

<item name="android:windowLightStatusBar" tools:ignore="NewApi">true</item>
Andres Paez
sumber
Ini berhasil untuk saya. Ini harus menjadi jawaban yang diterima.
abdul rehman
11

Tambahkan ini di style.xml Anda

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

dan ini di onCreate () Anda;

 getWindow().getDecorView().setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Michele Lacorte
sumber
1
Terima kasih, tapi ini tidak berhasil. Bilah status terlihat sama.
pt2121
tolong bantu untuk masalah ini ... masalah yang sama di sini .... tidak ada solusi yang sampai sekarang berhasil
Saeed Jassani
@SaeedJassani Saya menemukan solusi yang berhasil untuk saya. Jika Anda memiliki masalah yang sama, lihat pertanyaan dan jawaban saya: stackoverflow.com/a/33892569/1820644
kirtan403
9

Setelah tidak berhasil mencoba semua hal di atas, saya menemukan bahwa pengaturan tema secara eksplisit memperbaiki masalah.

setTheme(R.style.AppTheme);

Itu harus dilakukan sebelum super.OnCreate () dalam aktivitas Anda.

James Britton
sumber
1
Saya dapat mengonfirmasi bahwa ini memperbaiki aktivitas yang salah di Marshmallow
dare0021
love you man, bekerja seperti pesona, meskipun saya masih tidak tahu mengapa: @
Adeel Ahmad
sebelum super.OnCreate () adalah kuncinya
Karthik Rk
9

Letakkan saja item ini di v21 \ styles.xml Anda:

benar

Ini akan terlihat seperti ini:

<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>

Rami
sumber
1
Ini berhasil untuk saya menggunakan falsenilai dalam 2 item terakhir. Aneh, tapi terima kasih.
JCarlosR
Ini berfungsi hanya dengan dua baris terakhir tetapi konten berada di belakang bilah status, padding / margin atau fitSystemWindows tidak membantu. Diuji pada OP 5 yang menjalankan nougat
Anton Makov
9

Saya menghadapi masalah yang sama. Apa yang saya lakukan adalah, di file "v21 / styles.xml" a mengubah nilai true:

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

untuk:

 <item name="android:windowDrawsSystemBarBackgrounds">false</item>
Degomos
sumber
7
<item name="android:statusBarColor">@android:color/transparent</item>

Anda akan melihat baris kode itu di values ​​/ styles / styles.xml (v21). Hapus itu dan itu menyelesaikan masalah

Tautan ke jawaban ini

Phares
sumber
5

Saya memperbaiki masalah saya dengan mengubah tata letak Aktivitas saya dari FrameLayout ke RelativeLayout. Terima kasih semua orang yang mencoba membantu!

<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>

Coba hierarchy-viewer atau ViewInspector . Alat-alat ini mungkin membantu Anda.

pt2121
sumber
5

Hapus saja tag berikut dari gaya v21 @android: color / transparent

Ini berhasil untuk saya.

Shendre Kiran
sumber
@android: color / transparent bukan "tag". Ini mungkin nilai atribut gaya, tetapi ini bukan "tag". Bagaimana jika OP menetapkan nilai ini lebih dari sekali? Yang mana yang harus dia hapus? Jawaban Anda terlalu umum.
dilindungianggota
ya, aku juga begitu .. terima kasih, Shendre! :) dan atas komentar Anda, @protectedmember - OS tidak memiliki gender.
zeroDivider
3

Pendekatan yang lebih baik

Periksa file style.xml Anda di mana tema NoActionBar Anda ada di sana. Pastikan itu memiliki induk sebagai Theme.AppCompat.NoActionBar dan juga menyesuaikannya dengan menambahkan skema warna Anda. Terakhir, atur tema Anda dalam manifes sesuai kebutuhan.

Di bawah ini adalah contoh file styles.xml saya (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>
Nilesh Mahant
sumber
3

Saya telah menemukan solusi untuk ini -

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

tambahkan ini ke dalam gaya Anda dan ini akan bekerja untuk api 21 atau lebih tinggi.

being_sohelkhan
sumber
2

Bagi saya itu berhasil dengan melakukan hal berikut:

  1. Tetapkan tema .NoActionBar
  2. Bungkus Toolbar android.support.design.widget.AppBarLayout
  3. Jadikan android.support.design.widget.CoordinatorLayoutsebagai tata letak induk.

Pada dasarnya ini adalah langkah ketiga yang menggambar bilah status colorPrimaryDarkjika tidak, itu tidak akan digambar jika Anda menggunakan NoActionBartema. Langkah kedua akan memberikan toolbar Anda overlay .

priyankvex.dll
sumber
2

Untuk gaya v23

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

Untuk gaya v21

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

[Keluaran]

Perluas res -> nilai -> direktori gaya dari panel proyek.

Buka styles.xml (v21)

GUNAKAN SALAH SATU DARI CARA DI BAWAH

  1. Ubah benar menjadi salah di android:windowDrawsSystemBarBackgroundsproperti.
  2. Ubah @android: color / transparent menjadi @ color / colorPrimaryDark inandroid:statusBarColor properti.
  3. Hapus android:statusBarColorgaris propert.
Ketan Ramani
sumber
2

Jika v21 / styles.xml Anda berisi

<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>

Kemudian, Hapus atau komentari baris di bawah atau ubah warna bilah status,

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

Ini bekerja dengan baik. Semoga bermanfaat. Terima kasih.

sahu
sumber
1

Saya tidak yakin apakah ini terlambat tetapi saya harap ini membantu seseorang. * Buat tampilan palsu dengan latar belakang transparan yang sesuai dengan tata letak, dan jadikan tata letak koordinat sebagai elemen tata letak root Anda.

<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

vahidlazio
sumber
1

Ini berhasil bagi saya

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);
        }
Valdemir Nunes de Freitas
sumber
1
Halo, selamat datang di StackOverflow! Bisakah Anda mengedit jawaban Anda untuk menjelaskan mengapa jawaban ini berhasil? Penjelasan singkat tentang kode Anda sangat membantu!
Gigazelle
0

Dugaan saya adalah bahwa ini disebabkan oleh Anda android:windowBackground. Apakah @color/background_material_lightreferensi ke putih?

hanspeide
sumber
Nggak. Ini jelas bukan putih tapi terima kasih! (Anda dapat melihat ikon putih di atasnya.)
pt2121
Saya salah membaca pertanyaan Anda. Coba ganti <item name="android:statusBarColor">@android:color/transparent</item>dengan <item name="android:statusBarColor">@null</item>.
hanspeide
Hanya untuk memastikan saya memahami Anda dengan benar, apakah Anda ingin gambar ditampilkan di belakang bilah status?
hanspeide
0

Periksa apakah Toolbar ini berubah putih - AppBar tidak digambar setelah layar digulir

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

Saya menggunakan perpustakaan 23.0.0. dan bug masih terjadi.

Solusi untuk ini adalah menambahkan Tampilan yang hampir tidak memakan ruang dan tidak terlihat. Lihat struktur di bawah.

<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>

Pertanyaan ini di Stackoverflow.com merujuk ke bug ini juga: CoordinatorLayout Toolbar tidak terlihat saat masuk hingga AppBarLayout setinggi penuh - Tata letak terkadang tidak terlihat setelah masuk ke tampilan (meskipun tidak dimasukkan)

clickdroid
sumber
itu bukan bug yang sama. dalam kasus saya, warnanya putih setelah aktivitas tidak ditampilkan setelah digulir dari layar. terima kasih
pt2121
0

Jika Anda menggunakan RelativeLayout / CoordinatorLayout, ini adalah solusi yang berhasil untuk saya:

Anda harus menggunakan

  • CoordinatorLayout
  • AppBarLayout

Rember untuk menggunakan CoordinatorLayout daripada RelativeLayout (kinerjanya lebih baik dan bekerja sempurna dengan AppBarLayout)

Beginilah seharusnya fragmen Anda dimulai

<?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"
    >
    ...

Pengkodean yang bagus!

Faustino Gagneten
sumber
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>

tambahkan item 'windowTranslucentStatus' dalam gaya

sanjay
sumber
0

Tambahkan ini di style.xml Anda

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

Catatan: Pewarnaan bilah status tidak didukung di bawah API level 21.

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

Tambahkan 2 baris ini dalam file java di bawah ini

nitin kapsikar
sumber
1
Selamat datang di Stack Overflow. Bisakah Anda menjelaskan cara kerja kode Anda dan bagaimana kode tersebut membantu menyelesaikan Pertanyaan OP? Silakan merujuk ke cara menulis jawaban yang bagus untuk meningkatkan jawaban Anda
Tom M