我有一个 Activity 应用程序。它显示LoginFragment
,使状态和导航栏变为半透明,以便可以在其后面显示背景图像。但是,登录后,此片段将替换为另一个片段,该片段需要显示通常的实体状态栏和导航栏。因此,在删除LoginFragment
之前,它会取消设置其设置的标志,以使这些条变得不透明。
我面临的问题是,登录后,带有正常状态和导航栏的片段的操作栏向下移动。如果我将屏幕旋转到横向,然后又回到纵向以强制重新布局,则“ Action ”栏将恢复到正确的位置。
状态栏为半透明时。很好
在下一个屏幕上,操作栏向下移动。还要注意,根据主题,状态栏为黑色,应该为灰色。
现在,如果我返回第一个屏幕,则顶部的半透明条很好,但是整个内容向上移动,在下面留有空白。
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);
}