我有一个 Activity 应用程序。它显示LoginFragment,使状态和导航栏变为半透明,以便可以在其后面显示背景图像。但是,登录后,此片段将替换为另一个片段,该片段需要显示通常的实体状态栏和导航栏。因此,在删除LoginFragment之前,它会取消设置其设置的标志,以使这些条变得不透明。

我面临的问题是,登录后,带有正常状态和导航栏的片段的操作栏向下移动。如果我将屏幕旋转到横向,然后又回到纵向以强制重新布局,则“ Action ”栏将恢复到正确的位置。

状态栏为半透明时。很好
android - 清除FLAG_TRANSLUCENT_STATUS标志后,为什么我的布局困惑了?-LMLPHP

在下一个屏幕上,操作栏向下移动。还要注意,根据主题,状态栏为黑色,应该为灰色。
android - 清除FLAG_TRANSLUCENT_STATUS标志后,为什么我的布局困惑了?-LMLPHP

现在,如果我返回第一个屏幕,则顶部的半透明条很好,但是整个内容向上移动,在下面留有空白。
android - 清除FLAG_TRANSLUCENT_STATUS标志后,为什么我的布局困惑了?-LMLPHP
LoginFragment中的代码以编程方式使条形变为半透明并恢复它们:-

@Override
public void onResume() {
    super.onResume();
    if (hasTransparentStatusBar()) {
        setStatusBarTranslucent();
    }
}

@Override
public void onPause() {
    if (hasTransparentStatusBar()) {
        setStatusBarOpaque();
    }
    super.onPause();
}

protected boolean hasTransparentStatusBar() {
    return true;
}

protected void setStatusBarTranslucent() {
    if (Build.VERSION.SDK_INT >= 21) {
        Window window = getActivity().getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
                | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    }
}

protected void setStatusBarOpaque() {
    if (Build.VERSION.SDK_INT >= 21) {
        Window window = getActivity().getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
                | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    }
}

Activity 的布局xml:-
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.app.MainActivity" >

    <!-- The main content view -->

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->

    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@color/divider"
        android:dividerHeight="0dp"
        android:background="@color/primary"
        />

</android.support.v4.widget.DrawerLayout>
LoginFragment的布局xml:-

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:src="@drawable/logo"
    android:id="@+id/logo"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />

<Button
    android:padding="@dimen/default_margin"
    android:text="Login using Facebook"
    android:textColor="@android:color/white"
    android:background="@drawable/com_facebook_button_background"
    android:id="@+id/authButton"
    android:layout_below="@+id/logo"
    android:layout_centerHorizontal="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

最佳答案

我之前也遇到过同样的问题,因此,如果有人偶然发现此问题,则正确的解决方法是设置 NO_LIMITS 标志:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}

10-04 19:06