android:fitsSystemWindows="true" hat Probleme mit DrawerLayout und im immersiven Modus
Habe ich Probleme, wenn man versucht, immersive Modus und mit android:fitsSystemWindows="true"
mit DrawerLayout
. Ich habe dies gilt für die DrawerLayout
- und Symbolleiste gezwungen zu werden, um die system bar.
Das Problem ist, ich habe eine Fragment
setzt die Anwendung im immersiven Modus. Das macht die app tun:
Denen ich weiß, dass ist ein bekanntes Problem mit android:fitsSystemWindows="true"
. Ich habe es zu false
- und immersive-Modus funktioniert gut, aber die toolbar und der rest des Layouts ist nicht mehr gezwungen, das system bars. Ich versuche, die Einstellung der value-at-Laufzeit und der untere Teil des Layouts (aka die navigation bar) gefüllt wird von meinem layout, aber die system bar ist immer noch zu zeigen:
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 - ein-und Ausblenden
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;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK, habe ich endlich mein problem behoben. Stellt sich heraus, dass ich brauchte, um hinzuzufügen, die
FLAG_FULLSCREEN
Flagge. Hier ist mein fester code für zukünftige Zuschauer:DrawerLayout
Parameter). Konnte ich nur lösen Sie ihn, indem SiesetMargins(0, 0, 0, 0);
auf seine layout-Parameter. Wenn jemand Gesichter dieses problem, und hat eine elegantere Lösung wäre ich glücklich, von Ihnen zu lernen!Ich dachte, ich möchte hinzufügen, den folgenden code zu dem Gespräch. Ich musste Umschalten zwischen normaler Ansicht und Vollbild, und hielt mit den verschiedenen layout-Schwierigkeiten. Dies verursacht wurde, da
DrawerLayout
ProzessesetFitsSystemWindows()
im nicht-standard-Weg. Der folgende code erreicht, was ich brauchte.Das erste Geheimnis war zu ändern
setFitsSystemWindows()
auf dieCoordinatorLayout
statt derDrawerLayout
in der XML-Datei:Das Thema sollte angeben
<item name="android:windowTranslucentStatus">true</item>
imstyles.xml
.In Java, Holen Sie sich die Griffe für beide die
DrawerLayout
und dieCoordinatorLayout
.Diese app hat ein
SupportActionBar
. Wir brauchen ein handle für es so es sein kann, versteckt und offenbart.Zum Umschalten der status-und Navigationsleisten, die als durchscheinende overlays, verwenden Sie den folgenden code:
Abwechselnd hin und her wechseln komplett ausblenden der status-und Navigationsleisten im immersiven Modus, verwenden Sie den folgenden code.