【发布时间】:2015-12-07 06:25:49
【问题描述】:
我有一个 Activity 应用程序。它显示一个LoginFragment,它使状态栏和导航栏半透明,以便它可以在其后面显示背景图像。但是,登录后,该片段被另一个片段替换,该片段需要显示通常的实心状态和导航栏。因此,在删除 LoginFragment 之前,它会取消设置它设置的标志,以使条形不透明。
我面临的问题是,在我登录后,具有正常状态和导航栏的片段的操作栏向下移位。如果我将屏幕旋转为横向,然后再旋转回纵向以强制重新布局布局,则操作栏会弹回正确的位置。
在下一个屏幕上,操作栏向下移动。另请注意,状态栏是黑色的,根据主题应该是灰色的。
现在如果我回到第一个屏幕,顶部的半透明条没问题,但整个内容向上移动,下面留下一个空白区域。
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" />
【问题讨论】:
-
最后解决这个问题的唯一解决方法是我将
LoginFragment移动到另一个以沉浸式模式显示其片段的新活动下。其余的 Fragment 仍然由原始 Activity 提供服务。 -
我也遇到了类似的问题,但使用的是视图而不是片段。对我来说,
w.getDecorView().requestApplyInsets()在清除半透明标志后工作。 -
这应该是 Froyo 接受的答案,我要发布它!
标签: android android-layout android-fragments