Ich habe meine StatusBar-Farbe nur für Lollipop mit der folgenden Zeile in meinem Design auf transparent gesetzt:
<item name="android:statusBarColor">@android:color/transparent</item>
Jetzt muss ich dahinter zeichnen, aber ich kann keine Ansicht dahinter ziehen. Ich weiß, wie man das mit dem macht windowTranslucentStatus
-Eigenschaft, aber Sie möchten diese Eigenschaft nicht verwenden, da sie dann die Farbe der auf transparent gesetzten statusBar ignoriert.

Cody Toombs
Methode 1:
Um eine vollständig transparente Statusleiste zu erreichen, müssen Sie verwenden statusBarColor
das nur für API 21 und höher verfügbar ist. windowTranslucentStatus
ist auf API 19 und höher verfügbar, fügt jedoch einen getönten Hintergrund für die Statusleiste hinzu. Allerdings Einstellung windowTranslucentStatus
erreicht eine Sache, die sich ändert statusBarColor
zu transparent nicht: es setzt die SYSTEM_UI_FLAG_LAYOUT_STABLE
und SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
Flaggen. Der einfachste Weg, den gleichen Effekt zu erzielen, besteht darin, diese Flags manuell zu setzen, wodurch die vom Android-Layoutsystem auferlegten Einfügungen effektiv deaktiviert werden und Sie sich selbst überlassen müssen.
Sie rufen diese Leitung in Ihrem an onCreate
Methode:
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
Stellen Sie sicher, dass Sie auch die Transparenz in /res/values-v21/styles.xml festlegen:
<item name="android:statusBarColor">@android:color/transparent</item>
Oder legen Sie die Transparenz programmgesteuert fest:
getWindow().setStatusBarColor(Color.TRANSPARENT);
Die gute Seite dieses Ansatzes ist, dass dieselben Layouts und Designs auch auf API 19 verwendet werden können, indem die transparente Statusleiste gegen die getönte durchscheinende Statusleiste ausgetauscht wird.
<item name="android:windowTranslucentStatus">true</item>
Methode #2:
Wenn Sie nur ein Hintergrundbild unter Ihre Statusleiste malen müssen, anstatt eine Ansicht dahinter zu positionieren, können Sie dies tun, indem Sie einfach den Hintergrund des Themas Ihrer Aktivität auf das gewünschte Bild setzen und die Transparenz der Statusleiste wie in Methode # gezeigt einstellen. 1. Dies war die Methode, mit der ich die Screenshots für die erstellt habe Artikel zur Android-Polizei von vor ein paar Monaten.
Methode Nr. 3:
Wenn Sie die standardmäßigen Systemeinschübe für einige Layouts ignorieren müssen, während sie in anderen weiterhin funktionieren, besteht die einzige praktikable Möglichkeit darin, mit den häufig verknüpften zu arbeiten ScrimInsetsFrameLayout
Klasse. Natürlich sind einige der Dinge, die in dieser Klasse durchgeführt werden, nicht für alle Szenarien erforderlich. Wenn Sie beispielsweise nicht vorhaben, das synthetische Statusleisten-Overlay zu verwenden, kommentieren Sie einfach alles in der aus init()
-Methode und fügen Sie nichts zur Datei attrs.xml hinzu. Ich habe gesehen, dass dieser Ansatz funktioniert, aber ich denke, Sie werden feststellen, dass er einige andere Implikationen mit sich bringt, die eine Menge Arbeit bedeuten können, um sie zu umgehen.
Ich habe auch gesehen, dass Sie es ablehnen, mehrere Layouts zu umschließen. Im Fall des Umhüllens eines Layouts in ein anderes, wo beides der Fall ist match_parent
für Höhe und Breite sind die Auswirkungen auf die Leistung zu trivial, um sich darüber Gedanken zu machen. Unabhängig davon können Sie diese Situation vollständig vermeiden, indem Sie die Klasse ändern, aus der sie stammt FrameLayout
zu jeder anderen Art von Layout-Klasse, die Sie mögen. Es wird gut funktionieren.

Michael
Dies funktionierte für meinen Fall
// Create/Set toolbar as actionbar
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Check if the version of Android is Lollipop or higher
if (Build.VERSION.SDK_INT >= 21) {
// Set the status bar to dark-semi-transparentish
getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// Set paddingTop of toolbar to height of status bar.
// Fixes statusbar covers toolbar issue
toolbar.setPadding(0, getStatusBarHeight(), 0, 0);
}
// A method to find height of the status bar
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
Weitere Informationen zum Arbeiten mit statusBars: youtube.com/watch?v=_mGDMVRO3iE
Versuchen Sie dieses Thema
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimaryDark">@android:color/transparent</item>
<item name="colorPrimary">@color/md_blue_200</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
Stellen Sie sicher, dass Ihr Layout festgelegt ist
android:fitsSystemWindows="false"

Jeroen Mols
Anstatt
<item name="android:statusBarColor">@android:color/transparent</item>
Verwenden Sie Folgendes:
<item name="android:windowTranslucentStatus">true</item>
Und stellen Sie sicher, dass Sie die obere Polsterung (die standardmäßig hinzugefügt wird) in Ihrem ‘MainActivity’-Layout entfernen.
Beachten Sie, dass die Statusleiste dadurch nicht vollständig transparent wird und Ihre Statusleiste immer noch mit einem „verblassten Schwarz“ überlagert wird.
Die Lösung von Cody Toombs schon fast hat es mir angetan. Ich bin mir nicht sicher, ob dies der Fall ist Xamarin verwandt oder nicht, aber ich habe jetzt eine akzeptable Lösung:

Dies ist mein Setup:
Ich habe ein Android-Projekt, in dem ich auf die Pakete Android.Support v4 und v7 verwiesen habe. Ich habe zwei Stile definiert:
Werte/Stile.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
</style>
</resources>
Werte-v21/styles.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<resources>
<style name="MyStyle" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>
AndroidManifest zielt auf „MyStyle“ ab:
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.agn.test.test">
<uses-sdk android:minSdkVersion="10" />
<application android:allowBackup="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:theme="@style/MyStyle">
</application>
</manifest>
Und schließlich der Code in der Hauptaktivität:
[Activity (Label = "Test", MainLauncher = true, Icon = "@mipmap/icon")]
public class MainActivity : Activity
{
protected override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
SetContentView (Resource.Layout.Main);
//Resource.Layout.Main is just a regular layout, no additional flags. Make sure there is something in there like an imageView, so that you can see the overlay.
var uiOptions = (int)Window.DecorView.SystemUiVisibility;
uiOptions ^= (int)SystemUiFlags.LayoutStable;
uiOptions ^= (int)SystemUiFlags.LayoutFullscreen;
Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;
Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds);
}
}
Beachten Sie, dass ich das DrawsSystemBarBackgrounds-Flag gesetzt habe, das macht den Unterschied
Window.AddFlags (WindowManagerFlags.DrawsSystemBarBackgrounds);
Ich habe viel Zeit damit verbracht, es richtig zu machen, eigentlich zu viel Zeit. Hoffentlich hilft diese Antwort jedem, der versucht, dasselbe zu erreichen.
Die Antwort von @Cody Toombs führte zu einem Problem, das das Layout hinter die Navigationsleiste bringt. Was ich also gefunden habe, ist die Verwendung dieser Lösung von @Kriti
Hier ist das Kotlin-Code-Snippet für dasselbe:
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) {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}
if (Build.VERSION.SDK_INT >= 21) {
setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false)
getWindow().setStatusBarColor(Color.TRANSPARENT)
}
private fun setWindowFlag(activity: Activity, bits: Int, on: Boolean) {
val win: Window = activity.getWindow()
val winParams: WindowManager.LayoutParams = win.getAttributes()
if (on) {
winParams.flags = winParams.flags or bits
} else {
winParams.flags = winParams.flags and bits.inv()
}
win.setAttributes(winParams)
}
Sie müssen auch hinzufügen
android:fitsSystemWindows="false"
Stammansicht Ihres Layouts.
Ich hatte das gleiche Problem, also erstelle ich ImageView, das hinter der Statusleiste API 19+ zeichnet
Legen Sie ein benutzerdefiniertes Bild hinter der Statusleiste fest gist.github.com
public static void setTransparent(Activity activity, int imageRes) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return;
}
// set flags
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);
}
// get root content of system window
//ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
// rootView.setFitsSystemWindows(true);
// rootView.setClipToPadding(true);
ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
if (contentView.getChildCount() > 1) {
contentView.removeViewAt(1);
}
// get status bar height
int res = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
int height = 0;
if (res != 0)
height = activity.getResources().getDimensionPixelSize(res);
// create new imageview and set resource id
ImageView image = new ImageView(activity);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height);
image.setLayoutParams(params);
image.setImageResource(imageRes);
image.setScaleType(ScaleType.MATRIX);
// add image view to content view
contentView.addView(image);
// rootView.setFitsSystemWindows(true);
}
9143900cookie-checkLollipop : Zeichnen Sie hinter statusBar, wobei die Farbe auf transparent eingestellt istyes
Sie können auch verwenden
android:fitsSystemWindows="true"
– Aznix
28. Juli 2015 um 12:37 Uhr