Android Vollständig transparente Statusleiste?

183

Ich habe die Dokumentation durchsucht , aber nur Folgendes gefunden: Link . Womit wird der Balken durchscheinend ? Ich versuche, die Statusleiste vollständig transparent zu machen (siehe Abbildung unten) und sie abwärtskompatibel für APK <19 zu machen: Geben Sie hier die Bildbeschreibung ein

Meine styles.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>

Was ich konnte:

Geben Sie hier die Bildbeschreibung ein

Muhammad Ali
quelle

Antworten:

367

Sie müssen lediglich die folgenden Eigenschaften in Ihrem Thema festlegen:

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

Für Ihr Aktivitäts- / Container-Layout, für das Sie eine transparente Statusleiste wünschen, ist dieser Eigenschaftssatz erforderlich:

android:fitsSystemWindows="true"

Es ist im Allgemeinen nicht möglich, dies auf Pre-Kitkat sicher durchzuführen. Es sieht so aus, als könnten Sie es tun, aber ein seltsamer Code macht es so .

BEARBEITEN: Ich würde diese Bibliothek empfehlen: https://github.com/jgilfelt/SystemBarTint für viele Farbkontrollen in der Statusleiste vor dem Lutscher.

Nach langem Überlegen habe ich erfahren, dass die Antwort auf die vollständige Deaktivierung der Transluzenz oder einer Farbe in der Statusleiste und Navigationsleiste für Lollipop darin besteht, dieses Flag im Fenster zu setzen:

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

Es ist kein anderes Thema erforderlich, es erzeugt so etwas:

Geben Sie hier die Bildbeschreibung ein

Daniel Wilson
quelle
21
Ich habe den Code verwendet und dann ein Bild als Hintergrund hinzugefügt und dann android:fitsSystemWindows="true"zu meiner activity_main.xml hinzugefügt . Die Systemleisten sind durchscheinend und nicht transparent.
Muhammad Ali
9
Nun, ich glaube, alles, was Sie in diesem Fall brauchen, ist <item name="android:statusBarColor">@android:color/transparent</item>, Ihr Thema zu ergänzen :)
Daniel Wilson
6
Ja, danke für Ihre Geduld. Ich bin fast auf dem Sprung, seit ich dies in den letzten Stunden versucht habe. XD. Der obige Code funktioniert nicht, aber ich habe den Wert android:windowTranslucentStatusauf false gesetzt und die Statusleiste transparent gemacht. Jetzt habe ich dasselbe mit der Navigationsleiste gemacht und hinzugefügt, <item name="android:navigationBarColor">@android:color/transparent</item>aber beide Balken werden grau. PFUI!
Muhammad Ali
4
Um "adjustPan" zum Laufen zu bringen, verwenden Sie w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);stattdessen
Arda Kara
4
HINWEIS: Wenn Sie das Flag FLAG_LAYOUT_NO_LIMITS verwenden, wird Ihr Layout auch unter der virtuellen Navigationsleiste unten angezeigt. Im Allgemeinen wollen Sie dies nicht tun ... also ebenso, was andere Leute gesagt haben :-(
Kenyee
23

Fügen Sie einfach diese Codezeile zu Ihrer Java-Hauptdatei hinzu:

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
);
Abhijeet Farakate
quelle
43
Dies betrifft auch die Navigationsleiste.
Android-Entwickler
Dies funktioniert für mich, wenn ich unten mit Stil hinzufüge: <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style>
Jatinder Kumar
15

Sie können die externe Bibliothek StatusBarUtil verwenden :

Fügen Sie Ihrer Modulebene hinzu build.gradle:

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

Anschließend können Sie das folgende Dienstprogramm für eine Aktivität verwenden, um die Statusleiste transparent zu machen:

StatusBarUtil.setTransparent(Activity activity)

Beispiel:

transparente Statusleiste auf Lollipop und KitKat

David Rawson
quelle
Wie mache ich das für Navigation Drawer?
Reejesh PK
24
eine lib nur um dies zu lösen es ist wie eine Kerze mit einem Flammenwerfer anzünden
Felipe Castilhos
@FelipeCastilhos ja vielleicht, aber was ist, wenn Sie viele verschiedene Dinge mit der Statusleiste machen und nicht mit der schlechten API umgehen möchten, die Google Ihnen zur Verfügung stellt?
David Rawson
@ DavidRawson, das ist ein anderes Szenario. Hier geht es nur um mehr Transparenz. Warum sollten Sie Ihrer Codebasis viel mehr Code von Drittanbietern hinzufügen, um damit umzugehen?
Felipe Castilhos
13

Funktioniert für Android KitKat und höher (Für diejenigen, die die Statusleiste transparent machen und die Navigationsleiste nicht manipulieren möchten, da alle diese Antworten auch die Navigationsleiste transparent machen!)

Der einfachste Weg, dies zu erreichen:

styles.xml (v19)Fügen Sie diese 3 Codezeilen in das Feld -> ein. Wenn Sie nicht wissen, wie Sie dies haben sollen (v19), schreiben Sie sie einfach in Ihre Standardeinstellung styles.xmlund erstellen Sie sie dann automatisch mit alt+ enter:

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

Gehen Sie jetzt zu Ihrer MainActivityKlasse und setzen Sie diese Methode aus onCreate in die Klasse:

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

Fügen Sie dann diesen Code in die onCreateMethode der Aktivität ein:

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

Das ist es!

Parsa Dadras
quelle
1
Wie meine Erfahrung in React Native ... Die obigen Codes stehen in Konflikt mit der Anzeige der Tastatur (adjustResize). Also nehme ich nur kleine Änderungen vor: `` `if (Build.VERSION.SDK_INT> = 19) {getWindow (). GetDecorView (). SetSystemUiVisibility (View.SYSTEM_UI_FLAG_LAYOUT_STABLE); } `` `und in Component` `` <StatusBar translucent = {true} backgroundColor = "transparent" /> `` `und in AppManisfes - MainActivity` `` android: windowSoftInputMode = "adjustResize" `` `und die restlichen Codes sind gleich. fyi: `` `" react-native ":" 0.61.5 ",` `` danke @parsa dadras
Rudi Wijaya
12

Vollständig transparente Statusleiste und Navigationsleiste

@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);
}
Ahamadullah Saikat
quelle
Einzige Lösung, die für mich zusammen mit dem Kiosk-Modus (Screen Pinning) wirklich funktioniert hat.
Brontes
10

So zeichnen Sie Ihr Layout in der Statusleiste:

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>

Verwenden Sie CoordinatorLayout / DrawerLayout, die sich bereits um den Parameter fitSystemWindows kümmern, oder erstellen Sie ein eigenes Layout, das wie folgt aussieht:

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>

Ergebnis:

Bildschirmfoto:
Bildschirmfoto

Decam Entwickler
quelle
10

Sie können den folgenden Code verwenden, um die Statusleiste transparent zu machen. Siehe Bilder mit roter Markierung, mit deren Hilfe Sie die Verwendung des folgenden Codes identifizieren können

1]

Kotlin-Code-Snippet für Ihre Android-App

Schritt: 1 Notieren Sie sich den Code in On create method

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
}

Schritt 2: Sie benötigen die SetWindowFlag-Methode, die im folgenden Code beschrieben wird.

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
}

Java-Code-Snippet für Ihre Android-App:

Schritt 1: Main Activity - Code

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

Schritt 2: SetWindowFlag-Methode

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);
}
CodeInsideCofee
quelle
1
Ich teile meinen Code einfach mit unserer Entwickler-Community, um zu helfen. 😊
CodeInsideCofee
6

Verwenden Sie android:fitsSystemWindows="false"in Ihrem Top-Layout

Miguel
quelle
6
Dies betrifft auch die Navigationsleiste
Ebrahim Karimi
5

Hier ist eine Erweiterung in Kotlin, die den Trick macht:

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
    }
}
Felipe Castilhos
quelle
4

Wenn Sie diesen Code in Ihrem XML verwenden, können Sie die Zeitleiste in Ihrer Aktivität sehen:

<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">
Irfan Ali
quelle
3

ES GIBT DREI SCHRITTE:

1) Verwenden Sie dieses Codesegment einfach in Ihrer @ OnCreate-Methode

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

Wenn Sie an Fragment arbeiten, sollten Sie dieses Codesegment in die @ OnCreate-Methode Ihrer Aktivität einfügen.

2) Stellen Sie sicher, dass Sie die Transparenz auch in /res/values-v21/styles.xml festlegen:

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

Oder Sie können die Transparenz programmgesteuert einstellen:

getWindow().setStatusBarColor(Color.TRANSPARENT);

3) In jedem Fall sollten Sie das Codesegment in styles.xml hinzufügen

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

HINWEIS: Diese Methode funktioniert nur mit API 21 und höher.

Annas Bin Waheed
quelle
2

Sie können mein Beispiel auch mit animiertem Avatar und animiertem Text anzeigen

CollapsingAvatarToolbarSample

Lesen Sie meinen Beitrag auf Medium

Lassen Sie mich erklären, wie es funktioniert. Ich habe eine benutzerdefinierte Ansicht erstellt, die AppBarLayout.OnOffsetChangedListener implementiert . In der benutzerdefinierten HeadCollapsing-Ansicht habe ich die Text- und Bildansicht in AppBarLayout gegründet.

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

Ändern Sie dann die Ansichten über den berechneten Prozentsatz. Zum Beispiel, wie sich die Textansicht ändert:

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

Um zu erkennen, wann ein Bildausfall erforderlich ist, animieren Sie das erstellte Paarobjekt

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

mit Zuständen: 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
    }

dann cretaed Animation für Avatar swith Zustand:

 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)
            }
Serg Burlaka
quelle
2

Sie können das versuchen.

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);
    }
}
Faisal Naseer
quelle
1

Alle oben genannten Antworten basieren auf derselben Grundidee, und Sie können sie anhand eines der obigen Beispiele mit einfachen Layouts zum Laufen bringen. Ich wollte jedoch die Farbe des Hintergrunds ändern, während ich die Fragmentnavigation im Vollbildmodus (neben der Registerkartenleiste) verschob, und die regulären Navigations-, Registerkarten- und Aktionsleisten beibehalten.

Nachdem ich einen Artikel von Anton Hadutski sorgfältig gelesen hatte, hatte ich ein besseres Verständnis dafür, was los ist.

Ich habe DrawerLayoutmit ConstraintLayout(dh Container) Toolbar, der für das Hauptfragment und enthält BottomNavigationView.

Einstellung DrawerLayoutmit fitsSystemWindowsauf true nicht ausreichend ist, müssen Sie beide setzen DrawerLayoutund ConstraintLayout. Unter der Annahme einer transparenten Statusleiste entspricht die Farbe der Statusleiste jetzt der Hintergrundfarbe von ConstraintLayout.

Das enthaltene Fragment enthält jedoch weiterhin die Statusleiste, sodass durch das Animieren eines weiteren "Vollbild" -Fragments über mit die Farbe der Statusleiste nicht geändert wird.

Ein bisschen Code aus dem Artikel in Activity's onCreate:

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

Und alles ist gut, außer dass jetzt die ToolbarHöhe der Statusleiste nicht angesprochen wird. Einige weitere beziehen sich auf den Artikel und wir haben eine voll funktionsfähige Lösung:

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

Die Datei main_activity.xml (bitte beachten Sie, dass marginTop in Toolbarzu Vorschauzwecken dient und durch den Code ersetzt wird):

<?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>
hohteri
quelle
1

Ich fand es zu umständlich, mit styles.xml und Aktivitäten herumzuspielen, und erstellte daher eine allgemeine Dienstprogrammmethode, für die die folgenden Optionen festgelegt sind

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
}

Und das war alles, um eine transparente Statusleiste zu erreichen. Hoffe das hilft.

Sumit Sahoo
quelle
0

android:fitsSystemWindows="true"funktioniert nur auf v21. Wir können es in Theme XML oder im übergeordneten Layout wie LinearLayoutoder in einstellen CoordinateLayout. Für unter v21 konnten wir dieses Flag nicht hinzufügen. Bitte erstellen Sie style.xmlje nach Bedarf einen Ordner mit unterschiedlichen Werten und einer anderen Datei.

Ashish Saini
quelle
0

Das hat bei mir funktioniert:

<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>
greif.matthias
quelle
0

Alles was man braucht ist hineinzugehen 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);

    }
DINA TAKLIT
quelle
Allerdings bekomme ich einige beängstigende Fehler, wenn ich anfange, nach unten zu scrollen.
0

In meinem Fall, da ich eine untere Symbolleiste habe, hatte ich beim Testen der vorherigen Lösungen ein Problem. Die Schaltflächen des Android-Systems werden mit meinem unteren Menü abgedeckt. Meine Lösung besteht darin, innerhalb der Aktivität Folgendes hinzuzufügen:

protected 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);
Aymenhs
quelle
0

Sie können diesen Code unten verwenden.

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

Fügen Sie dieses Layout in Ihr Hauptlayout ein.

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>

Hinweis: Sie können SDP und SSP durch dp bzw. sp ersetzen.

Vivek Makwana
quelle
0

In meinem Fall rufe ich überhaupt nicht "onCreate" auf (es ist eine reaktionsfähige native App und dies kann auch mithilfe der reaktionsnativen StatusBar-Komponente behoben werden). Man kann auch Folgendes verwenden:

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
}
gor
quelle
0

Das sollte funktionieren

// Zum Beispiel in onCreate () von Activity

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);
}
Bevorzugen Sie okechukwu
quelle
0

Ich habe die Antwort gefunden, als ich diese Bibliothek untersucht habe: https://github.com/laobie/StatusBarUtil

Daher müssen Sie Ihrer Aktivität die folgenden Codes hinzufügen

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)
}
Ali Gürelli
quelle
0

Fügen Sie diese Zeilen vor dem setContentView () zu Ihrer Aktivität hinzu.

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

Fügen Sie diese 2 Zeilen in Ihr AppTheme ein

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

und als letztes muss deine minSdkVersion b 19 sein

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

Verwendung Dont windowLightStatusBarVerwendung anstellestatusBarColor = @android:color/transparent

NickUnuchek
quelle
-1

Dies ist nur für API Level> = 21. Es funktioniert für mich. Hier ist mein Code (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
}
Capotasto
quelle