Как применить fitsSystemWindows на страницах фрагмента ViewPager?
Я не могу заставить мои страницы моего ViewPager соблюдать высоту строки состояния. У моего ViewPager есть несколько страниц, на одной из которых есть изображение, которое нужно перейти под полупрозрачную строку состояния. На остальных страницах требуется только цветная строка состояния, поэтому моя идея заключалась в том, чтобы использовать fitsSystemWindows="true" в макетах фрагментов, которые будут использоваться в качестве страниц для виджета. Но это не работает. Кажется, что на первом рисунке только вторые страницы применяют отступы. Но при прокрутке страниц. Это исчезает. Поэтому мне кажется, что страницы не получают отправку от 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) {
}
});
}
}
Затем в какой-то момент времени я загружаю следующий фрагмент в frag_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 ответов
Прежде всего, вы должны применить полноэкранный режим к своей деятельности, чтобы все фрагменты в вашей деятельности были в fitsSystemWindow (Fullscreen), затем для каждого фрагмента вы можете установить цвет statusBar, который будет запускать полноэкранный или нормальный режим. Если статубар прозрачный, то фрагмент в полноэкранном режиме. Включить полноэкранный режим:
window.decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
Включение / отключение полноэкранного режима путем окрашивания строки состояния:
activity?.window?.statusBarColor = Color.TRANSPARENT //Fullscreen
activity?.window?.statusBarColor = Color.TRANSPARENT //non-Fullscreen
Просто включите отключение, когда ваш полноэкранный режим виден или скрыт
Прочтите об этом сообщение:https://medium.com/jama9779/single-activity-with-fullscreen-simple-fragments-fefe7f041765