我无法让ViewPager的页面尊重状态栏的高度。 我的ViewPager有多个页面,其中一个页面上需要在半透明的状态栏下放置一个图像。其余页面仅需要彩色的状态栏,因此我的想法是在片段布局上使用fitsSystemWindows =“ true”,以用作viewpager的页面。但这不起作用。似乎在第一张纸上只有第二页得到了填充。但是在滚动页面时。它消失了。所以在我看来,页面没有从ViewPager获得派发以应用插图。但是我不知道如何实现它。
我试图做些事情
public static void setOnApplyWindowInsetsListener(View v, OnApplyWindowInsetsListener listener)
,但我无法工作。我的想法是在每个新页面上以某种方式应用插图。也许这是正确的方法,但是我找不到合适的位置来调用此方法。
有没有人可以帮助我解决这个问题? 我将在下面放置一些代码,以提供有关此问题的一些上下文。
Activity.xml
<..WindowInsetsFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
这是一个自定义布局管理器,用于支持更改片段(片段过渡)并再次应用windowInset。仅供参考,这是代码:
public class WindowInsetsFrameLayout extends FrameLayout {
public WindowInsetsFrameLayout(@NonNull Context context) {
this(context, null);
}
public WindowInsetsFrameLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public WindowInsetsFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// Look for replaced fragments and apply the insets again.
setOnHierarchyChangeListener(new OnHierarchyChangeListener() {
@Override
public void onChildViewAdded(View parent, View child) {
requestApplyInsets();
}
@Override
public void onChildViewRemoved(View parent, View child) {
}
});
}
}
然后在某个时间点将以下片段加载到fragment_container。
fragmentWithViewpager.xml
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.ViewPagerController
android:id="@+id/view_pager_controller"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:showConfirmButton="true" />
</android.support.constraint.ConstraintLayout>
其中ViewPagerController是ViewPager,TabLayout(用于ViewPager的页面指示)和我在下面的布局中省略的一些按钮的支架。
ViewPagerController
<merge>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/tab_layout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="spread" />
...some other buttons for next en previous of the ViewPager...
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="wrap_content"
android:layout_height="@dimen/size_48"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="parent"
app:layout_constraintStart_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/view_pager"
app:tabBackground="@drawable/tab_selector"
app:tabIndicatorHeight="0dp" />
</merge>
最后,大多数ViewPager页面具有以下布局:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="handler"
type="fragmentX" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background_white">
<android.support.constraint.ConstraintLayout
android:id="@+id/top_panel"
android:layout_width="0dp"
android:layout_height="@dimen/header_input_height"
android:background="@color/colorPrimary"
android:fitsSystemWindows="true"
android:paddingEnd="@dimen/size_16"
android:paddingStart="@dimen/size_16"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageButton
android:id="@+id/close_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/actionBarItemBackground"
android:minHeight="@dimen/size_48"
android:minWidth="@dimen/size_48"
android:onClick="@{(V) -> handler.onClose()}"
android:src="@drawable/ic_close"
app:layout_constraintBottom_toBottomOf="@id/icon_img"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/icon_img" />
<ImageView
android:id="@+id/icon_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_16"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_logo" />
<TextView
android:id="@+id/title_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_32"
android:fontFamily="@font/alvania_regular"
android:text="title or page"
android:textColor="@color/white"
android:textSize="@dimen/font_size_biggest"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/icon_img" />
<TextView
android:id="@+id/message_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_8"
android:alpha="0.87"
android:fontFamily="@font/frutiger_light"
android:gravity="center"
android:lineSpacingExtra="8sp"
android:text="sub title fo a page"
android:textColor="@color/white"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/title_txt" />
</android.support.constraint.ConstraintLayout>
...more views
</android.support.constraint.ConstraintLayout>
</layout>
答案 0 :(得分:0)
首先,您必须对活动应用“全屏”,这样活动中的所有片段都将显示在fitsSystemWindow(全屏)上,然后可以在每个片段上设置statusBar颜色,这将触发全屏或正常情况。如果状态栏透明,则以全屏显示片段。 启用全屏:
window.decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
通过为StatusBar着色来启用/禁用全屏显示:
activity?.window?.statusBarColor = Color.TRANSPARENT //Fullscreen
activity?.window?.statusBarColor = Color.TRANSPARENT //non-Fullscreen
当全屏可见或隐藏时,只需启用即可禁用
阅读有关它的文章: https://medium.com/jama9779/single-activity-with-fullscreen-simple-fragments-fefe7f041765