Подтвердить что ты не робот

Android CoordinatorLayout + AppbarLayout + Viewpager всегда прокручивает

У меня есть классический макет с ToolBar на вершине, в TabLayout под ним, а ViewPager переключения вкладок с TabLayout. Когда содержание в ViewPager прокручивать, то ToolBar должен прокручивать из виду, и TabLayout должны следовать и придерживаться, когда она достигает вершины.

Все это хорошо в моем текущем коде, за исключением того, тулбар всегда прокручивать, независимо от размера содержимого ViewPager. См. Мой код ниже. Любые блестящие идеи о том, как это исправить?

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/primary"
        android:orientation="vertical">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.ToolBar"
            app:layout_scrollFlags="scroll|enterAlways" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:scrollbars="horizontal"
            app:tabIndicatorColor="@color/black_text" />

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/tabs_activity_view_pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</android.support.design.widget.CoordinatorLayout>

EDIT:

Я вижу, что высота viewPager такая же, как высота для всего корневого представления. Это может быть намеренно, так как appbar_scrolling_view_behavior, похоже, добавляет верхнее и нижнее смещение. Однако это выглядит странно, так как это приведет к тому, что всегда будут прокручиваться панель инструментов и табуляция.

4b9b3361

Ответ 1

На основе других образцов, моего собственного кода и (несколько грязного) исходного кода appbar_scrolling_view_behavior:

        public boolean onDependentViewChanged(CoordinatorLayout parent, View child,
            View dependency) {
        final CoordinatorLayout.Behavior behavior =
                ((CoordinatorLayout.LayoutParams) dependency.getLayoutParams()).getBehavior();
        if (behavior instanceof Behavior) {
            // Offset the child so that it is below the app-bar (with any overlap)

            final int appBarOffset = ((Behavior) behavior)
                    .getTopBottomOffsetForScrollingSibling();
            final int expandedMax = dependency.getHeight() - mOverlayTop;
            final int collapsedMin = parent.getHeight() - child.getHeight();

            if (mOverlayTop != 0 && dependency instanceof AppBarLayout) {
                // If we have an overlap top, and the dependency is an AppBarLayout, we control
                // the offset ourselves based on the appbar scroll progress. This is so that
                // the scroll happens sequentially rather than linearly
                final int scrollRange = ((AppBarLayout) dependency).getTotalScrollRange();
                setTopAndBottomOffset(AnimationUtils.lerp(expandedMax, collapsedMin,
                        Math.abs(appBarOffset) / (float) scrollRange));
            } else {
                setTopAndBottomOffset(dependency.getHeight() - mOverlayTop + appBarOffset);
            }
        }
        return false;
    }

Я читаю это так, чтобы объяснить проблему, так как это ожидаемое поведение с этим кодом.

Мне кажется, нам нужно написать собственное поведение прокрутки, особенно для RecyclerView,

Ответ 2

Я предложил вам попробовать этот образец.

это макет, как ваш макет в образце.

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_scrollFlags="scroll|enterAlways" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:layout_margin="@dimen/fab_margin"
        android:src="@drawable/ic_done" />

</android.support.design.widget.CoordinatorLayout>

Ответ 3

используя ListView в качестве данных для ViewPager? Если это так, вам нужно listView.setNestedScrollingEnabled(true);

Ответ 4

Попробуйте добавить эти атрибуты в TabLayout:

 app:layout_collapseMode="pin"
 app:tabMode="fixed"

И это на AppBarLayout:

 android:fitsSystemWindows="true"

* ОБНОВЛЕНИЕ *

Я попробовал, и этого недостаточно, поскольку панель инструментов по-прежнему прокручивается. Решение состоит в том, чтобы сделать некоторую логику о ViewPager (и его содержимом).

Удалите из файла макета xml атрибут scroll_flag панели инструментов. Вы должны реализовать некоторый Java-код, чтобы проверить, есть ли высота содержимого ViewPager > then screenHeight - (панель инструментов + tabBar). Если true, установите программно scroll_flags следующим образом:

 LayoutParams params;
 params = // get layout params from your toolbar

 params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
| AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);

 // set params
 toolbar.setLayoutParams(params);

Ответ 5

Высота ViewPager должна быть match_parent, а не wrap_content.

Ответ 6

У меня была такая же проблема. Решение очень просто, просто установите высоту viewpager

android:layout_height="wrap_content"

Ответ 7

Простым решением является - оберните свою панель и панель просмотра приложения с относительной компоновкой. - дайте вашему макету панели приложений какой-то идентификатор - в режиме просмотра страницы Android: layout_below = "Your_appbar_layout" Например:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<android.support.design.widget.AppBarLayout
    android:id="@+id/your_appBar_ID"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/primary"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.ToolBar"
        app:layout_scrollFlags="scroll|enterAlways" />

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:scrollbars="horizontal"
        app:tabIndicatorColor="@color/black_text" />

</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/tabs_activity_view_pager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/your_appBar_ID"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</RelativeLayout>