it-swarm.com.de

Android Vollständig transparente Statusleiste?

Ich habe die Dokumentation gesucht, aber nur Folgendes gefunden: Link . Welches wird verwendet, um die Leiste durchscheinend zu erstellen? Was ich versuche, ist, die Statusleiste vollständig transparent (wie in der Abbildung unten gezeigt) zu machen und für APK <19:.enter image description here

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:

enter image description here

104
Muhammad Ali

Alles, was Sie tun müssen, ist, diese Eigenschaften in Ihrem Design festzulegen:

<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, muss diese Eigenschaft festgelegt sein:

Android:fitsSystemWindows="true"

Es ist in der Regel nicht möglich, dies mit Pre-KitKat sicher durchzuführen. Sieht so aus, als könnten Sie , aber ein seltsamer Code macht es so .

BEARBEITEN: Ich würde dieses lib empfehlen: https://github.com/jgilfelt/SystemBarTint für eine Menge Farbsteuerung der Statusleiste vor dem Lollipop.

Nach langem Nachdenken habe ich gelernt, dass die Antwort auf eine vollständige Deaktivierung der Transluzenz oder einer Farbe in der Statusleiste und der Navigationsleiste für Lollipop darin besteht, dieses Flag in dem 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 Theme nötig, es produziert so etwas:

enter image description here

244
Daniel Wilson

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

Sie können die externe Bibliothek StatusBarUtil verwenden:

Fügen Sie Ihrer Modulebene build.gradle hinzu:

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

Dann können Sie die folgende Anwendung für eine Aktivität verwenden, um die Statusleiste transparent zu machen:

StatusBarUtil.setTransparent(Activity activity)

Beispiel:

 transparent status bar on Lollipop and KitKat

11
David Rawson

Funktioniert mit 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, es zu erreichen:

Fügen Sie diese 3 Codezeilen in die styles.xml (v19) ein. -> Wenn Sie nicht wissen, wie Sie dies haben sollen (v19), schreiben Sie sie einfach in Ihren Standard-styles.xml und verwenden Sie dann alt+enter um es automatisch zu erstellen:

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

Gehen Sie jetzt zu Ihrer Klasse MainActivity 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 Methode onCreate 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!

6
parsa dadras

Verwenden Sie Android:fitsSystemWindows="false" in Ihrem obersten Layout

5
Miguel

So zeichnen Sie Ihr Layout in der Statusleiste:

values ​​/ styles.xml

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

werte-v21/styles.xml

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

Verwenden Sie CoordinatorLayout/DrawerLayout, das sich bereits um den Parameter fitsSystemWindows kümmert, oder erstellen Sie Ihr eigenes Layout, um Folgendes zu erreichen:

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

4
Decam Developer

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

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

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

Vollständig transparente Status- 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);
}
2

ES GIBT DREI SCHRITTE:

1) Verwenden Sie einfach dieses Codesegment 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 auch die Transparenz in /res/values-v21/styles.xml ein:

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

Oder Sie können die Transparenz programmgesteuert einstellen:

getWindow().setStatusBarColor(Color.TRANSPARENT);

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

0

Android:fitsSystemWindows="true" funktioniert nur bei v21. Wir können es in Theme-XML oder in übergeordnetem Layout wie LinearLayout oder in CoordinateLayout einstellen. Für unter Version 21 konnte dieses Flag nicht hinzugefügt werden . Bitte erstellen Sie einen anderen Wertordner mit verschiedenen style.xml -Dateien, je nach Bedarf. 

0
Ashish Saini

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

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

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

CollapsingAvatarToolbarSample

Lies meinen Beitrag auf Medium

 

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

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 text Ansicht ändern:

         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 Bildzusammenbruch erforderlich ist, animieren Sie das erstellte Pair-Objekt

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 Kreta-Animation für den Avatar-Status:

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

füge diese Zeilen vor setContentView () in deine Aktivität ein

 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

    minSdkVersion 19

Alles was man braucht ist in MainActivity.Java zu gehen


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

    }
0
John