Android Bar Status sepenuhnya transparan?


184

Saya telah mencari dokumentasi tetapi hanya menemukan ini: Tautan . Yang digunakan untuk membuat bilah tembus ? Apa yang saya coba lakukan adalah membuat bilah status benar-benar transparan (seperti yang ditunjukkan pada gambar di bawah) dan membuatnya kompatibel ke belakang untuk APK <19: masukkan deskripsi gambar di sini

Styles.xml saya:

<resources xmlns:tools="http://schemas.android.com/tools">

  <style name="AppTheme" parent="Theme.AppCompat.Light">
  <item name="android:actionBarStyle">@style/ThemeActionBar</item>
  <item name="android:windowActionBarOverlay">true</item>
  <!-- Support library compatibility -->
  <item name="actionBarStyle">@style/ThemeActionBar</item>
  <item name="windowActionBarOverlay">true</item>
  </style>

  <style name="ThemeActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid">
  <item name="android:background"> @null </item>
  <!-- Support library compatibility -->
  <item name="background">@null</item>
  <item name="android:displayOptions"> showHome | useLogo</item>
  <item name="displayOptions">showHome|useLogo</item>

  </style>

</resources>

Apa yang bisa saya lakukan:

masukkan deskripsi gambar di sini

Jawaban:


369

Yang perlu Anda lakukan adalah mengatur properti ini dalam tema Anda:

<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>

Tata letak aktivitas / wadah Anda yang ingin memiliki bilah status transparan memerlukan set properti ini:

android:fitsSystemWindows="true"

Secara umum tidak mungkin untuk melakukan ini pada pra-kitkat, sepertinya Anda bisa melakukannya tetapi beberapa kode aneh membuatnya begitu .

EDIT: Saya akan merekomendasikan lib ini: https://github.com/jgilfelt/SystemBarTint untuk banyak kontrol warna bilah status pra-lollipop.

Nah setelah banyak pertimbangan saya telah belajar bahwa jawaban untuk sepenuhnya menonaktifkan translucency atau warna apa pun yang ditempatkan pada bilah status dan bilah navigasi untuk lollipop adalah dengan menetapkan bendera ini di jendela:

// In Activity's onCreate() for instance
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window w = getWindow();
    w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}

Tidak diperlukan tema lain, itu menghasilkan sesuatu seperti ini:

masukkan deskripsi gambar di sini


21
Saya menggunakan kode dan kemudian menambahkan gambar sebagai latar belakang dan kemudian ditambahkan android:fitsSystemWindows="true"ke activity_main.xml saya. Bilah sistem transparan dan tidak transparan.
Muhammad Ali

9
Yah, saya percaya semua yang Anda butuhkan dalam hal ini adalah menambahkan <item name="android:statusBarColor">@android:color/transparent</item>tema Anda :)
Daniel Wilson

7
Ya kami, terima kasih atas kesabaran Anda, saya hampir miring karena saya sudah mencoba melakukan ini selama beberapa jam terakhir xD. Kode di atas tidak berfungsi namun saya mengaturnya android:windowTranslucentStatuske false dan membuat bilah status transparan. Sekarang saya melakukan hal yang sama dengan bilah navigasi dan menambahkan <item name="android:navigationBarColor">@android:color/transparent</item>tetapi membuat kedua bilah menjadi abu-abu. UGH!
Muhammad Ali

4
Untuk membuat "adjustPan" penggunaan kerja w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);bukan
Arda Kara

4
CATATAN: menggunakan bendera FLAG_LAYOUT_NO_LIMITS juga akan meletakkan tata letak Anda di bawah bilah nav virtual di bagian bawah. Secara umum, Anda tidak ingin melakukan ini ... jadi apa yang orang lain katakan :-(
kenyee

23

Cukup tambahkan baris kode ini ke file java utama Anda:

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
);

45
Ini juga memengaruhi bilah navigasi.
pengembang android

16

Anda dapat menggunakan perpustakaan eksternal StatusBarUtil :

Tambahkan ke level modul Anda build.gradle:

compile 'com.jaeger.statusbarutil:library:1.4.0'

Kemudian Anda dapat menggunakan util berikut untuk Aktivitas untuk membuat bilah status transparan:

StatusBarUtil.setTransparent(Activity activity)

Contoh:

bilah status transparan pada Lollipop dan KitKat


Bagaimana cara melakukannya untuk Drawer Navigasi?
Reejesh PK

24
Lib hanya untuk menyelesaikan ini seperti menyalakan lilin dengan penyembur api
Felipe Castilhos

@FelipeCastilhos ya mungkin, tetapi bagaimana jika Anda melakukan banyak hal yang berbeda dengan status bar dan Anda tidak ingin berurusan dengan API buruk yang disediakan Google?
David Rawson

@ DavidVawson itu skenario yang berbeda. Di sini kita berbicara tentang menambah transparansi saja. Mengapa menambahkan lebih banyak kode pihak ketiga ke basis kode Anda hanya untuk menanganinya?
Felipe Castilhos

14

Berfungsi untuk Android KitKat dan yang lebih tinggi (Bagi mereka yang ingin menghapus status bar dan tidak memanipulasi NavigationBar, karena semua jawaban ini juga akan transparan pada NavigationBar!)

Cara termudah untuk mencapainya:

Letakkan 3 baris kode ini di styles.xml (v19)-> jika Anda tidak tahu cara memilikinya (v19), tulis saja di default Anda styles.xmldan kemudian gunakan alt+ enteruntuk membuatnya secara otomatis:

<item name="android:windowFullscreen">false</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:fitsSystemWindows">false</item>

Dan sekarang, pergi ke MainActivityKelas Anda dan keluarkan Metode ini dari onCreate di kelas:

public static void setWindowFlag(Activity activity, final int bits, boolean on) {

    Window win = activity.getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    if (on) {
        winParams.flags |= bits;
    } else {
        winParams.flags &= ~bits;
    }
    win.setAttributes(winParams);
}

Kemudian masukkan kode ini dalam onCreatemetode Kegiatan:

if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
        setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true);
    }
    if (Build.VERSION.SDK_INT >= 19) {
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }
    //make fully Android Transparent Status bar
    if (Build.VERSION.SDK_INT >= 21) {
        setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);
        getWindow().setStatusBarColor(Color.TRANSPARENT);
    }

Itu dia!


1
Seperti pengalaman saya dalam Bereaksi Asli ... Kode di atas bertentangan dengan menampilkan keyboard (AdjustResize). Jadi, saya hanya melakukan sedikit perubahan: `` `if (Build.VERSION.SDK_INT> = 19) {getWindow (). GetDecorView (). SetSystemUiVisibility (View.SYSTEM_UI_FLAG_LAYOUT_STABLE); } `` `dan dalam Komponen` `` <StatusBar translucent = {true} backgroundColor = "transparan" /> `` `dan di AppManisfes - MainActivity` `` android: windowSoftInputMode = "AdjustResize" `` `dan kode lainnya adalah sama. fyi: `` `" react-asli ":" 0.61.5 ",` `` terima kasih @parsa dadras
Rudi Wijaya

12

StatusBar dan NavigationBar yang sepenuhnya transparan

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    transparentStatusAndNavigation();
}


private void transparentStatusAndNavigation() {
    //make full transparent statusBar
    if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
        setWindowFlag(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, true);
    }
    if (Build.VERSION.SDK_INT >= 19) {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        );
    }
    if (Build.VERSION.SDK_INT >= 21) {
        setWindowFlag(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, false);
        getWindow().setStatusBarColor(Color.TRANSPARENT);
        getWindow().setNavigationBarColor(Color.TRANSPARENT);
    }
}

private void setWindowFlag(final int bits, boolean on) {
    Window win = getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    if (on) {
        winParams.flags |= bits;
    } else {
        winParams.flags &= ~bits;
    }
    win.setAttributes(winParams);
}

Hanya solusi yang benar-benar bekerja untuk saya bersama dengan mode kios (menyematkan layar)
Brontes

11

Untuk menggambar tata letak Anda di bawah bilah status:

values ​​/ styles.xml

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

values-v21 / styles.xml

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

Gunakan CoordinatorLayout / DrawerLayout yang sudah menangani parameter fitsSystemWindows atau buat tata letak Anda sendiri seperti ini:

public class FitsSystemWindowConstraintLayout extends ConstraintLayout {

    private Drawable mStatusBarBackground;
    private boolean mDrawStatusBarBackground;

    private WindowInsetsCompat mLastInsets;

    private Map<View, int[]> childsMargins = new HashMap<>();

    public FitsSystemWindowConstraintLayout(Context context) {
        this(context, null);
    }

    public FitsSystemWindowConstraintLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public FitsSystemWindowConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        if (ViewCompat.getFitsSystemWindows(this)) {
            ViewCompat.setOnApplyWindowInsetsListener(this, new android.support.v4.view.OnApplyWindowInsetsListener() {
                @Override
                public WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) {
                    FitsSystemWindowConstraintLayout layout = (FitsSystemWindowConstraintLayout) view;
                    layout.setChildInsets(insets, insets.getSystemWindowInsetTop() > 0);
                    return insets.consumeSystemWindowInsets();
                }
            });
            setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            TypedArray typedArray = context.obtainStyledAttributes(new int[]{android.R.attr.colorPrimaryDark});
            try {
                mStatusBarBackground = typedArray.getDrawable(0);
            } finally {
                typedArray.recycle();
            }
        } else {
            mStatusBarBackground = null;
        }
    }

    public void setChildInsets(WindowInsetsCompat insets, boolean draw) {
        mLastInsets = insets;
        mDrawStatusBarBackground = draw;
        setWillNotDraw(!draw && getBackground() == null);

        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            if (child.getVisibility() != GONE) {
                if (ViewCompat.getFitsSystemWindows(this)) {
                    ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) child.getLayoutParams();

                    if (ViewCompat.getFitsSystemWindows(child)) {
                        ViewCompat.dispatchApplyWindowInsets(child, insets);
                    } else {
                        int[] childMargins = childsMargins.get(child);
                        if (childMargins == null) {
                            childMargins = new int[]{layoutParams.leftMargin, layoutParams.topMargin, layoutParams.rightMargin, layoutParams.bottomMargin};
                            childsMargins.put(child, childMargins);
                        }
                        if (layoutParams.leftToLeft == LayoutParams.PARENT_ID) {
                            layoutParams.leftMargin = childMargins[0] + insets.getSystemWindowInsetLeft();
                        }
                        if (layoutParams.topToTop == LayoutParams.PARENT_ID) {
                            layoutParams.topMargin = childMargins[1] + insets.getSystemWindowInsetTop();
                        }
                        if (layoutParams.rightToRight == LayoutParams.PARENT_ID) {
                            layoutParams.rightMargin = childMargins[2] + insets.getSystemWindowInsetRight();
                        }
                        if (layoutParams.bottomToBottom == LayoutParams.PARENT_ID) {
                            layoutParams.bottomMargin = childMargins[3] + insets.getSystemWindowInsetBottom();
                        }
                    }
                }
            }
        }

        requestLayout();
    }

    public void setStatusBarBackground(Drawable bg) {
        mStatusBarBackground = bg;
        invalidate();
    }

    public Drawable getStatusBarBackgroundDrawable() {
        return mStatusBarBackground;
    }

    public void setStatusBarBackground(int resId) {
        mStatusBarBackground = resId != 0 ? ContextCompat.getDrawable(getContext(), resId) : null;
        invalidate();
    }

    public void setStatusBarBackgroundColor(@ColorInt int color) {
        mStatusBarBackground = new ColorDrawable(color);
        invalidate();
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mDrawStatusBarBackground && mStatusBarBackground != null) {
            int inset = mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0;
            if (inset > 0) {
                mStatusBarBackground.setBounds(0, 0, getWidth(), inset);
                mStatusBarBackground.draw(canvas);
            }
        }
    }
}

main_activity.xml

<FitsSystemWindowConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:fitsSystemWindows="true"
        android:scaleType="centerCrop"
        android:src="@drawable/toolbar_background"
        app:layout_constraintBottom_toBottomOf="@id/toolbar"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?attr/actionBarSize"
        android:background="@android:color/transparent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:gravity="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Content"
            android:textSize="48sp" />
    </LinearLayout>
</FitsSystemWindowConstraintLayout>

Hasil:

Tangkapan layar:
Tangkapan layar


10

Anda Dapat Menggunakan Kode Di Bawah Ini Untuk Membuat Bilah Status Transparan. Lihat Gambar dengan sorotan merah yang membantu Anda mengidentifikasi penggunaan kode di bawah ini

1]

Cuplikan kode Kotlin untuk aplikasi Android Anda

Langkah: 1 Tuliskan kode pada Metode On create

if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
    setWindowFlag(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true)
}
if (Build.VERSION.SDK_INT >= 19) {
    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}
if (Build.VERSION.SDK_INT >= 21) {
    setWindowFlag(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false)
    window.statusBarColor = Color.TRANSPARENT
}

Langkah2: Anda Membutuhkan metode SetWindowFlag yang menjelaskan dalam kode di bawah ini.

private fun setWindowFlag(bits: Int, on: Boolean) {
    val win = window
    val winParams = win.attributes
    if (on) {
        winParams.flags = winParams.flags or bits
    } else {
        winParams.flags = winParams.flags and bits.inv()
    }
    win.attributes = winParams
}

Cuplikan kode Java untuk aplikasi Android Anda:

Langkah1: Kode Kegiatan Utama

if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21) {
    setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true);
}
if (Build.VERSION.SDK_INT >= 19) {
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}

if (Build.VERSION.SDK_INT >= 21) {
    setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);
    getWindow().setStatusBarColor(Color.TRANSPARENT);
}

Langkah2: Metode SetWindowFlag

public static void setWindowFlag(Activity activity, final int bits, boolean on) {
    Window win = activity.getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    if (on) {
        winParams.flags |= bits;
    } else {
        winParams.flags &= ~bits;
    }
    win.setAttributes(winParams);
}

1
saya hanya membagikan kode saya dengan komunitas pengembang kami untuk membantu. 😊
CodeInsideCofee


5

Berikut ini adalah ekstensi di kotlin yang melakukan trik:

fun Activity.setTransparentStatusBar() {
    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        window.statusBarColor = Color.TRANSPARENT
    }
}

4

Dengan menggunakan kode ini dalam XML Anda, Anda akan dapat melihat bilah waktu dalam aktivitas Anda:

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

3

ADA TIGA LANGKAH:

1) Cukup gunakan segmen kode ini ke metode @OnCreate Anda

@OnCreate{
  // FullScreen
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, 
  WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}

jika Anda mengerjakan Fragment, Anda harus meletakkan segmen kode ini dalam metode @OnCreate aktivitas Anda.

2) Pastikan juga mengatur transparansi di /res/values-v21/styles.xml:

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

Atau Anda dapat mengatur transparansi secara program:

getWindow().setStatusBarColor(Color.TRANSPARENT);

3) Dengan cara apa pun Anda harus menambahkan segmen kode di styles.xml

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

CATATAN: Metode ini hanya berfungsi pada API 21 dan di atasnya.


2

Anda juga dapat melihat contoh saya dengan avatar animasi dan teks animasi

CollapsingAvatarToolbarSample

Baca posting saya di Medium

Jadi izinkan saya untuk menjelaskan cara kerjanya. Saya membuat tampilan kustom yang diimplementasikan AppBarLayout.OnOffsetChangedListener . Di dalam HeadCollapsing Custom View saya menemukan tampilan teks dan gambar di AppBarLayout.

class HeadCollapsing(context: Context, attrs: AttributeSet?) : 
 FrameLayout(context, attrs), AppBarLayout.OnOffsetChangedListener {

  private fun findViews() {
            appBarLayout = findParentAppBarLayout()

            avatarContainerView = findViewById(R.id.imgb_avatar_wrap)

            titleToolbarText =  findViewById<AppCompatTextView>(id)

        }

  private fun findParentAppBarLayout(): AppBarLayout {
    val parent = this.parent
    return parent as? AppBarLayout ?: if (parent.parent is AppBarLayout) {
        parent.parent as AppBarLayout
    } else {
        throw IllegalStateException("Must be inside an AppBarLayout")
    }
}

  ...

     override fun onOffsetChanged(appBarLayout: AppBarLayout, offset:Int) {
           ...
           //Calculate expanded percentage
           val expandedPercentage = 1 - -offset / maxOffset
           updateViews(expandedPercentage)
     }
}

Kemudian ubah tampilan melalui persentase yang dihitung. Misalnya, bagaimana tampilan teks berubah:

         when {
                inversePercentage < ABROAD -> {
                    titleToolbarText?.visibility = View.VISIBLE
                    titleTolbarTextSingle?.visibility = View.INVISIBLE
                }

                inversePercentage > ABROAD -> {
                    titleToolbarText?.visibility = View.INVISIBLE
                    titleTolbarTextSingle?.visibility = View.VISIBLE
                    titleTolbarTextSingle?.let {
                        animateShowText(it)
                    }
                }
            }

Untuk mendeteksi ketika membutuhkan gambar runtuh animasi buat objek Pair

private var cashCollapseState: kotlin.Pair<Int, Int>? = null

dengan status: TO_EXPANDED_STATE, TO_COLLAPSED_STATE, WAIT_FOR_SWITCH, SWITCHED

  companion object {
        const val ABROAD = 0.95f
        const val TO_EXPANDED_STATE = 0
        const val TO_COLLAPSED_STATE = 1
        const val WAIT_FOR_SWITCH = 0
        const val SWITCHED = 1
    }

lalu kreta animasi untuk status avatar swith:

 when {
                cashCollapseState != null && cashCollapseState != state -> {
                    when (state.first) {
                        TO_EXPANDED_STATE -> {
                          // do calculates
                        }
                        TO_COLLAPSED_STATE -> {

                    ValueAnimator.ofFloat(avatarContainerView.translationX, translationX).apply {
                        addUpdateListener {
                            avatarContainerView.translationX = it.animatedValue as Float
                        }

                        duration = 350
                        (state.first == TO_COLLAPSED_STATE).apply {
                            if (this) interpolator = LinearInterpolator()
                        }
                        start()
                    }
                //SWITCH STATE CASE
                cashCollapseState = kotlin.Pair(state.first, SWITCHED)
            }

            else -> {
                cashCollapseState = kotlin.Pair(state.first, WAIT_FOR_SWITCH)
            }

2

Anda dapat mencobanya.

private static void setStatusBarTransparent(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        activity.getWindow(). setStatusBarColor(Color.TRANSPARENT);
    } else {
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
}

1

Sementara semua jawaban di atas beredar di sekitar ide dasar yang sama dan Anda bisa membuatnya bekerja dengan tata letak sederhana menggunakan salah satu contoh di atas. Namun saya ingin mengubah warna latar belakang saat menggunakan navigasi fragmen 'layar penuh' (menyamping tab) dan mempertahankan navigasi, tab, dan panel aksi biasa.

Setelah membaca dengan seksama sebuah artikel oleh Anton Hadutski saya lebih memahami apa yang sedang terjadi.

Saya miliki DrawerLayoutdengan ConstraintLayout(yaitu wadah) yang telah Toolbar, termasuk untuk fragmen utama dan BottomNavigationView.

Pengaturan DrawerLayoutharus fitsSystemWindowsbenar tidak cukup, Anda perlu mengatur keduanya DrawerLayoutdan ConstraintLayout. Dengan asumsi bilah status transparan, warna bilah status sekarang sama dengan warna latar belakang ConstraintLayout.

Namun, fragmen yang disertakan masih inset status bar, jadi menghidupkan fragmen 'layar penuh' lain di atas dengan tidak mengubah warna bilah status.

Sedikit kode dari artikel disebut dalam Activity's onCreate:

ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
        insets.replaceSystemWindowInsets(
                insets.systemWindowInsetLeft,
                0,
                insets.systemWindowInsetRight,
                insets.systemWindowInsetBottom
        )
    }

Dan semuanya baik-baik saja, kecuali sekarang Toolbartidak mengatasi tinggi bilah status. Beberapa lebih merujuk pada artikel dan kami memiliki solusi yang berfungsi penuh:

val toolbar = findViewById<Toolbar>(R.id.my_toolbar)
    ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.container)) { view, insets ->
        val params = toolbar.layoutParams as ViewGroup.MarginLayoutParams
        params.topMargin = insets.systemWindowInsetTop
        toolbar.layoutParams = params
        insets.replaceSystemWindowInsets(
                insets.systemWindowInsetLeft,
                0,
                insets.systemWindowInsetRight,
                insets.systemWindowInsetBottom
        )
    }

Main_activity.xml (harap dicatat bahwa marginTop in Toolbaradalah untuk keperluan pratinjau, itu akan diganti oleh kode):

<?xml version="1.0" encoding="utf-8"?>
    <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        >

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/green"
        android:fitsSystemWindows="true"
        tools:context=".MainActivity">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/my_toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_constraintTop_toTopOf="@id/container"
            android:layout_marginTop="26dp" 
            android:background="@android:color/transparent"
            ...>
            ...
        </androidx.appcompat.widget.Toolbar>

        <include layout="@layout/content_main" />
        ...
    </androidx.constraintlayout.widget.ConstraintLayout>
    ...
</androidx.drawerlayout.widget.DrawerLayout>

1

Saya menemukan mengutak-atik styles.xml dan aktivitas terlalu rumit sehingga menciptakan metode utilitas umum yang memiliki opsi di bawah ini ditetapkan

Jawa

Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
window.setStatusBarColor(Color.TRANSPARENT);

Kotlin DSL

activity.window.apply {
    clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    statusBarColor = Color.TRANSPARENT
}

Dan hanya itu yang diperlukan untuk mencapai bilah status transparan. Semoga ini membantu.


0

android:fitsSystemWindows="true"hanya bekerja di v21. Kita dapat mengaturnya di tema xml atau di tata letak induk suka LinearLayoutatau dalam CoordinateLayout. Untuk di bawah v21, Kami tidak dapat menambahkan bendera ini. Harap buat folder nilai yang berbeda dengan style.xmlfile yang berbeda sesuai kebutuhan Anda.


0

Ini bekerja untuk saya:

<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowTranslucentNavigation">false</item>

0

Yang dibutuhkan hanyalah masuk MainActivity.java


protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Window g = getWindow();
        g.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

        setContentView(R.layout.activity_main);

    }

Namun saya mendapatkan beberapa bug yang menakutkan ketika saya mulai menggulir ke bawah.

0

dalam kasus saya karena saya memiliki bilah alat bawah Saya punya masalah ketika menguji solusi sebelumnya, tombol sistem android ditutupi dengan menu bawah saya solusi saya adalah untuk menambahkan dalam aktivitas:

void onCreate yang dilindungi (Bundle SavedInstanceState) {super.onCreate (SavedInstanceState);

    // force full screen mode
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);


    setContentView(R.layout.main_activity_container);

0

Anda dapat menggunakan kode di bawah ini.

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 
getWindow().setStatusBarColor(Color.TRANSPARENT);

Sertakan tata letak ini di tata letak utama Anda.

toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolbarNav"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"
        app:contentInsetEnd="0dp"
        app:contentInsetLeft="0dp"
        app:contentInsetRight="0dp"
        app:contentInsetStart="0dp">

        <RelativeLayout
            android:id="@+id/rlBackImageLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/main_background2">  //add your color here

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="@dimen/_40sdp"
                android:layout_marginTop="@dimen/_16sdp"
                android:orientation="horizontal">

                <ImageView
                    android:id="@+id/toolbarIcon"
                    android:layout_width="@dimen/_30sdp"
                    android:layout_height="@dimen/_30sdp"
                    android:layout_gravity="center"
                    android:layout_marginStart="@dimen/_10sdp"
                    android:padding="@dimen/_5sdp"
                    android:src="@drawable/nav_icon" />

                <TextView
                    android:id="@+id/txtTitle"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_gravity="center"
                    android:layout_marginEnd="@dimen/_30sdp"
                    android:fontFamily="@font/muli_semibold"
                    android:gravity="center"
                    android:textColor="#fff"
                    android:textSize="@dimen/_14ssp"
                    android:textStyle="bold"
                    tools:text="test Data" />

            </LinearLayout>

        </RelativeLayout>

    </androidx.appcompat.widget.Toolbar>

Catatan: Anda dapat mengganti SDP dan SSP dengan dp dan sp masing-masing.


0

dalam kasus saya, saya sama sekali tidak memanggil "onCreate" (ini adalah aplikasi asli yang bereaksi dan ini dapat diperbaiki juga dengan menggunakan komponen StatusBar yang asli-reaksi) kita juga dapat menggunakan ini:

override fun onStart() {
        super.onStart()
        window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.statusBarColor = Color.TRANSPARENT
}

0

Ini seharusnya bekerja

// Dalam Aktivitas's onCreate () misalnya

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window w = getWindow();
    w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}

0

Saya menemukan jawabannya ketika saya menyelidiki perpustakaan ini: https://github.com/laobie/StatusBarUtil

jadi Anda perlu menambahkan kode berikut ke aktivitas Anda

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
    window.statusBarColor = Color.TRANSPARENT
} else {
    window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
}

0

tambahkan baris ini ke dalam Aktivitas Anda sebelum setContentView ()

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window w = getWindow();
    w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}

tambahkan 2 baris ini ke dalam AppTheme Anda

<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>

dan hal terakhir minSdkVersion Anda harus b 19

minSdkVersion 19

-1
 <item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item>
            <!--<item name="android:windowLightStatusBar" tools:targetApi="m">true</item>-->

Jangan gunakan windowLightStatusBargunakan sebagai gantinyastatusBarColor = @android:color/transparent


-1

Ini hanya untuk API Level> = 21. Ini berfungsi untuk saya. Ini kode saya (Kotlin)

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById<View>(android.R.id.content).systemUiVisibility =
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.