Ich habe Probleme, wenn Sie Immersive-Modus verwenden und android:fitsSystemWindows="true"
mit DrawerLayout
verwenden. Ich muss dies auf True für die DrawerLayout
und Symbolleiste auf die Systemleiste beschränkt werden.android: fitsSystemWindows = "true" hat Probleme mit der Verwendung von DrawerLayout und Immersive-Modus
Das Problem ist, ich habe eine Fragment
, die die Anwendung auf Immersive-Modus setzt. Dies macht die App dies tun:
Welche ich weiß, ist ein bekanntes Problem mit android:fitsSystemWindows="true"
. Ich setze es auf false
und Immersive-Modus funktioniert gut, aber die Symbolleiste und der Rest des Layouts ist nicht mehr auf die Systemleisten beschränkt. Ich versuche Ihnen den Wert zur Laufzeit und den unteren Teil des Layouts (auch bekannt als die Navigationsleiste Bereich) durch mein Layout gefüllt ist, aber das System Bar noch zeigt:
Hier ist mein Code:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
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/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
ClockFragment.java - Hide and Show
private void hideSystemUI() {
if (Build.VERSION.SDK_INT >= 14) {
getActivity().findViewById(R.id.drawer_layout).setFitsSystemWindows(false);
}
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
if (Build.VERSION.SDK_INT >= 19) {
mDecorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
} else if (Build.VERSION.SDK_INT >= 16) {
mDecorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN);
} else {
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
toolbar.setVisibility(View.GONE);
layoutParams.screenBrightness = -1.00f;
getActivity().getWindow().setAttributes(layoutParams);
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
uiShowing = false;
dimming = false;
screenMode = 1;
}
private void hideSystemUIAndDim() {
if (Build.VERSION.SDK_INT >= 14) {
getActivity().findViewById(R.id.drawer_layout).setFitsSystemWindows(false);
}
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
if (Build.VERSION.SDK_INT >= 19) {
mDecorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
} else if (Build.VERSION.SDK_INT >= 16) {
mDecorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN);
} else {
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
toolbar.setVisibility(View.GONE);
layoutParams.screenBrightness = 0.01f;
getActivity().getWindow().setAttributes(layoutParams);
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
uiShowing = false;
dimming = true;
screenMode = 2;
}
private void showSystemUI() {
if (Build.VERSION.SDK_INT >= 14) {
getActivity().findViewById(R.id.drawer_layout).setFitsSystemWindows(true);
}
if (Build.VERSION.SDK_INT >= 16) {
mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} else {
getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
toolbar.setVisibility(View.VISIBLE);
layoutParams.screenBrightness = -1.00f;
getActivity().getWindow().setAttributes(layoutParams);
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
uiShowing = true;
dimming = false;
screenMode = 0;
}
Ich sah mich nach verschiedenen Lösungen um, kam aber immer wieder auf Ihre Lösung zurück. Danke, dass du so viel von deinem Code gepostet hast.:) – miqueloi
Dies ist die wichtigste Antwort auf dieses Problem. Allerdings habe ich festgestellt, dass in meinem Fall das erste Kind des Schubladenlayouts seine Ränder/Einfügungen nicht automatisch angepasst hat (seine Layout-Parameter waren auch keine regulären Layout-Parameter, sondern "DrawerLayout" -Parameter). Ich konnte es nur lösen, indem ich 'setMargins (0, 0, 0, 0);' auf seinen Layoutparametern aufrief. Wenn jemand anderes mit diesem Problem konfrontiert wird und eine elegantere Lösung hat, würde ich mich freuen, von Ihnen zu lernen! – Mdlc