Как применить 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

Другие вопросы по тегам