@mrkovalchuk
Junior developer

Как заставить TabLayout скролиться вместе с ViewPager?

106a3d5aa22147658192822503d497eb.jpg

Добра. Подскажите, пожалуйста, как сделать так, чтобы при пролистывании списка (ViewPager) вниз, уходил весь AppBar? Потом листаем вверх и, вуаля, видим снова наш бар. Как в Google приложениях.

Если и не совсем точный ответ, то ссылку на материал, буду очень признателен.

Ниже layout.

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorMainBackground"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.Toolbar
                android:id = "@+id/toolbar"
                android:layout_width = "match_parent"
                android:theme="@style/ThemeOverlay.AppCompat.Dark"
                android:layout_height = "?attr/actionBarSize"
                android:background="?attr/colorPrimary"/>

            <android.support.design.widget.TabLayout
                android:id="@+id/tabLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:tabIndicatorColor="@android:color/white"
                app:tabIndicatorHeight="6dp"
                app:tabSelectedTextColor="@android:color/white"
                app:tabTextColor="@android:color/white"/>

        </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:src="@mipmap/ic_refresh"
            android:layout_gravity="end|bottom"
            android:layout_marginBottom="@dimen/fab_margin"
            android:layout_marginRight="@dimen/fab_margin"
            />
    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/menu_navigation"
        app:headerLayout="@layout/navigation_header"/>

</android.support.v4.widget.DrawerLayout>
  • Вопрос задан
  • 608 просмотров
Пригласить эксперта
Ответы на вопрос 1
ziginsider
@ziginsider
C#, Xamarin, Android, python
Т.к. для разметки у вас используется CoordinatorLayout, то лёгкий способ:

Добавляем одну строчку в описании Toolbar:

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


или то же самое делаем в коде, когда инициализируем toolbar:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
AppBarLayout.LayoutParams params =  (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);


Если нужна более тонкая настройка анимации, придется вручную:

Например, у вас список listView и appbar, который нужно прятать или снова показывать когда крутим список.
Получаем список, получаем appbar... Например, так:
appbar = (AppBarLayout) getActivity().findViewById(R.id.appbar_layout);

Слушаем скролл списка и запускаем соответствующую анимацию:
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if (view.getId() == listView.getId()) {
                    final int currentFirstVisibleItem = listView.getFirstVisiblePosition();
                    if (currentFirstVisibleItem > mLastFirstVisibleItem) {

                        //прячем appbar
                        appbar.animate().translationY(-appbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();

                    } else if (currentFirstVisibleItem < mLastFirstVisibleItem) {

                        //возвращаем на место...
                        appbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start();

                    }
                    mLastFirstVisibleItem = currentFirstVisibleItem;
                }
            }
        });
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы