Android Tamamen şeffaf Durum Çubuğu mu?


184

Belgeleri aradım ama sadece şunu buldum: Link . Çubuğu yarı saydam yapmak için hangisi kullanılır ? Yapmaya çalıştığım durum çubuğunu tamamen şeffaf yapmak (aşağıdaki resimde gösterildiği gibi) ve APK <19 için geriye doğru uyumlu hale getirmek: resim açıklamasını buraya girin

Benim stillerim.xml:

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

Ne yapabilirdim:

resim açıklamasını buraya girin

Yanıtlar:


369

Tek yapmanız gereken temanızda şu özellikleri ayarlamaktır:

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

Şeffaf bir durum çubuğuna sahip olmak istediğiniz etkinlik / kapsayıcı yerleşiminizin bu özellik kümesine ihtiyacı var:

android:fitsSystemWindows="true"

Bunu önceden kitkat'te kesin olarak yapmak genellikle mümkün değildir, bunu yapabileceğinize benziyor, ancak bazı garip kodlar bunu yapıyor .

EDIT: lolipop öncesi durum çubuğu renk kontrolü çok için bu lib: https://github.com/jgilfelt/SystemBarTint tavsiye ederim .

Pek çok müzakereden sonra, şeffaflığı veya durum çubuğuna ve lolipop için gezinme çubuğuna yerleştirilen herhangi bir rengi tamamen devre dışı bırakmanın cevabının bu bayrağı pencereye ayarlamak olduğunu öğrendim:

// 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);
}

Başka tema gerektirmez, böyle bir şey üretir:

resim açıklamasını buraya girin


21
Kodu kullandım ve daha sonra arka plan olarak bir resim ekledim ve sonra android:fitsSystemWindows="true"activity_main.xml dosyasına ekledim . Sistem çubukları yarı saydamdır ve şeffaf değildir.
Muhammed Ali

9
Peki bu durumda ihtiyacınız olan tek şey <item name="android:statusBarColor">@android:color/transparent</item>temanıza eklemek olduğuna inanıyorum :)
Daniel Wilson

7
Evet, sabrınız için teşekkür ederim, bunu son birkaç saattir yapmaya çalıştığımdan beri neredeyse eğimdeyim xD. Yukarıdaki kod çalışmıyor ancak android:windowTranslucentStatusfalse olarak ayarlayın ve durum çubuğunu şeffaf yaptı. Şimdi aynı şeyi gezinme çubuğu ile yaptım ve ekledim <item name="android:navigationBarColor">@android:color/transparent</item>ama her iki çubuğu da gri yapıyor. UGH!
Muhammed Ali

4
Onun w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);yerine "adjustPan" iş kullanımı yapmak için
Arda Kara

4
NOT: FLAG_LAYOUT_NO_LIMITS bayrağını kullanmak, mizanpajınızı alttaki sanal gezinme çubuğunun altına da koyacaktır. Genel olarak, bunu yapmak istemezsiniz ... öyleyse diğer insanların söylediklerine göre :-(
kenyee

23

Bu kod satırını ana java dosyanıza eklemeniz yeterlidir:

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

45
Bu, gezinme çubuğunu da etkiler.
android geliştirici

16

StatusBarUtil harici kütüphanesini kullanabilirsiniz :

Modül seviyenize ekleyin build.gradle:

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

Ardından, durum çubuğunu şeffaf hale getirmek için bir Etkinlik için aşağıdaki kullanımı kullanabilirsiniz:

StatusBarUtil.setTransparent(Activity activity)

Misal:

Lollipop ve KitKat'ta saydam durum çubuğu


Gezinti Çekmecesi için bu nasıl yapılır?
Reejesh PK

24
bir lib sadece bunu çözmek için onun gibi bir alev ile bir mum ışığı
Felipe Castilhos

@FelipeCastilhos evet belki, ama durum çubuğu ile çok farklı şeyler yapıyorsanız ve Google'ın size sağladığı kötü API ile uğraşmak istemiyorsanız ne olur?
David Rawson

@DavidRawson bu farklı bir senaryo. Burada sadece şeffaflık katmaktan bahsediyoruz. Neden sadece işlemek için kod tabanınıza çok daha fazla üçüncü taraf kodu eklemelisiniz?
Felipe Castilhos

14

Android KitKat ve üstü için çalışır (Durum çubuğunu saydam yapmak ve NavigationBar'ı manipüle etmek istemeyenler için, tüm bu cevaplar NavigationBar'ı da saydamlayacaktır!)

Bunu başarmanın en kolay yolu:

styles.xml (v19)Bunu nasıl yapacağınızı bilmiyorsanız bu 3 kod satırını -> içine koyun (v19), bunları varsayılan ayarınıza yazın styles.xmlve ardından otomatik olarak oluşturmak için alt+ enterkullanın:

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

Ve şimdi, MainActivitySınıfınıza gidin ve bu Yöntemi sınıfta onCreate'den çıkarın:

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);
}

Sonra bu kodu onCreateEtkinlik yöntemine ekleyin:

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);
    }

Bu kadar!


1
React Native'deki deneyimim olarak ... Yukarıdaki kodlar klavyeyi göstermeyle çakışıyor (adjustResize). Yani, sadece küçük değişiklikler yapıyorum: `` if (Build.VERSION.SDK_INT> = 19) {getWindow (). GetDecorView (). SetSystemUiVisibility (View.SYSTEM_UI_FLAG_LAYOUT_STABLE); } `` `ve Bileşen` `` `<StatusBar yarı saydam = {true} backgroundColor =" şeffaf "/>` `` ve AppManisfes - MainActivity'de `` android: windowSoftInputMode = "adjustResize" "` `ve geri kalan kodlar aynı. fyi: `` "tepki-yerli": "0.61.5", `` teşekkür ederim @parsa dadras
Rudi Wijaya

12

Tamamen Şeffaf StatusBar ve NavigationBar

@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);
}

Sadece kiosk modu ile birlikte benim için gerçekten işe yarayan bir çözüm (Ekran sabitleme).
Brontes

11

Durum çubuğunun altında mizanpajınızı çizmek için:

değerler / styles.xml

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

değerler V21 / styles.xml

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

FitsSystemWindows parametresiyle zaten ilgilenen CoordinatorLayout / DrawerLayout kullanın veya bunu yapmak için kendi düzeninizi oluşturun:

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>

Sonuç:

Ekran görüntüsü:
Ekran görüntüsü


10

Durum Çubuğunu Şeffaf Yapmak İçin Aşağıdaki Kodu Kullanabilirsiniz. Aşağıdaki kodun kullanımını belirlemenize yardımcı olan kırmızı vurgulamalı Görüntülere bakın

1]

Android uygulamanız için Kotlin kod snippet'i

Adım: 1 On create Method içindeki kodu yazın

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
}

Adım2: Aşağıdaki kodda açıklanan SetWindowFlag yöntemine ihtiyacınız var.

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
}

Android uygulamanız için Java kod snippet'i:

1. Adım: Ana Etkinlik Kodu

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);
}

Adım2: SetWindowFlag Yöntemi

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
sadece yardımcı olmak için kodumu geliştirici topluluğumuzla paylaşıyorum. 😊
CodeInsideCofee


5

İşte kotlin'de hile yapan bir uzantı:

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

XML'nizde bu kodu kullanarak, etkinliğinizde zaman çubuğunu görebilirsiniz:

<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

ÜÇ ADIM VAR:

1) Bu kod segmentini @OnCreate yönteminizde kullanın

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

Fragment üzerinde çalışıyorsanız bu kod segmentini etkinliğinizin @OnCreate yöntemine koymalısınız.

2) /res/values-v21/styles.xml dosyasında saydamlığı da ayarladığınızdan emin olun:

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

Veya saydamlığı programlı olarak ayarlayabilirsiniz:

getWindow().setStatusBarColor(Color.TRANSPARENT);

3) Zaten kod segmentini styles.xml dosyasına eklemelisiniz

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

NOT: Bu yöntem yalnızca API 21 ve sonraki sürümlerde çalışır.


2

Örneğimi animasyonlu avatar ve animasyonlu metinle de görüntüleyebilirsiniz

CollapsingAvatarToolbarSample

Medium'daki yayınımı oku

Nasıl çalıştığını açıklamama izin verin. AppBarLayout.OnOffsetChangedListener uygulanan özel görünüm oluşturdum . HeadCollapsing Custom View içinde AppBarLayout'ta metin ve görüntü görünümü kurdum.

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

Ardından, hesaplanan yüzdeyle görünümleri değiştirin. Örneğin, metin görünümünün nasıl değiştiği:

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

Görüntü daraltma gerektiğinde algılamak ve oluşturulan Pair nesnesine animasyon

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

durumları ile: TO_EXPANDED_STATE, TO_COLLAPSED_STATE, WAIT_FOR_SWITCH, ANAHTARLI

  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
    }

sonra avatar swith devlet için cretaed animasyon:

 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

Bunu deneyebilirsin.

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

Yukarıdaki tüm cevaplar aynı temel fikir etrafında dolaşırken ve yukarıdaki örneklerden birini kullanarak basit düzenlerle çalışmasını sağlayabilirsiniz. Ancak, kayan 'tam ekran' (sekme çubuğu bir yana) parça navigasyonunu kullanırken arka planın rengini değiştirmek ve düzenli gezinme, sekme ve eylem çubuklarını korumak istedim.

Anton Hadutski'nin bir makalesini dikkatle okuduktan sonra neler olduğunu daha iyi anladım.

Ben DrawerLayoutile ConstraintLayoutolan (yani, kap) Toolbar, ana fragmanı ve şunları içerir BottomNavigationView.

Ayar DrawerLayoutsahip fitsSystemWindowstrue yeterli değildir, her iki ayarlamanız gerekir DrawerLayoutve ConstraintLayout. Saydam durum çubuğu varsayıldığında, durum çubuğu rengi artık arka plan rengiyle aynıdır ConstraintLayout.

Bununla birlikte, dahil edilen parçanın hala durum çubuğu eki vardır, bu nedenle üstte başka bir 'tam ekran' parçasının canlandırılması durum çubuğunun rengini değiştirmez.

İçine sevk makaleden kod Biraz Activity'ler onCreate:

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

Ve hepsi iyi, ancak şimdi Toolbardurum çubuğu yüksekliğini ele almıyor. Bazıları makaleye atıfta bulunuyor ve tamamen çalışan bir çözümümüz var:

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 (lütfen marginTop in'in Toolbarönizleme amaçlı olduğunu, kodla değiştirileceğini unutmayın):

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

Styles.xml ve aktivite ile uğraşmak çok hantal buldum, bu nedenle aşağıda ayarlanan seçeneklere sahip ortak bir yardımcı program yöntemi oluşturdum

Java

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
}

Ve şeffaf durum çubuğuna ulaşmak için gereken tek şey bu. Bu yardımcı olur umarım.


0

android:fitsSystemWindows="true"sadece v21 üzerinde çalışın. Tema xml'de veya gibi LinearLayoutveya ana düzende ayarlayabiliriz CoordinateLayout. Aşağıda v21 için, bu bayrağı ekleyemedik. Lütfen style.xmlihtiyacınıza göre farklı dosya ile farklı değerler klasörü oluşturun .


0

Bu benim için çalıştı:

<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

Tüm ihtiyaç duymak 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);

    }

Ancak aşağı kaydırmaya başladığımda bazı korkunç hatalar alıyorum.

0

Benim durumumda alt araç çubuğum var gibi önceki çözümleri test ederken bir sorun yaşadım, android sistem düğmeleri benim alt menü ile kaplıdır benim çözüm faaliyet içinde eklemek için:

korunmuş void onCreate (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

Aşağıdaki kodu kullanabilirsiniz.

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

Bu düzeni ana düzeninize ekleyin.

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>

Not: SDP ve SSP'yi sırasıyla dp ve sp ile değiştirebilirsiniz.


0

benim durumumda, hiç "onCreate" (onun bir tepki yerel uygulama ve bu da tepki yerel NaturBar bileşenini kullanarak da düzeltmeler olabilir) çağrı yok bir de kullanabilirsiniz:

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

Bu çalışmalı

// Örneğin, Etkinliğin onCreate () öğesinde

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

Bu kütüphaneyi araştırırken cevabı buldum: https://github.com/laobie/StatusBarUtil

etkinliğinize aşağıdaki kodları eklemeniz gerekir

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

setContentView () öğesinden önce bu satırları Etkinliğinize ekleyin

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);
}

bu 2 satırı AppTheme'inize ekleyin

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

ve minSdkVersion son 19 b olmalıdır

minSdkVersion 19

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

windowLightStatusBarBunun yerine kullanımı kullanmastatusBarColor = @android:color/transparent


-1

Bu sadece API Seviyesi> = 21 içindir. Benim için çalışıyor. İşte kodum (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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.