Панель инструментов и табличный вид не скрываются при прокрутке RecyclerView вверх

#java #android #toolbar #android-tablayout

#java #Android #панель инструментов #android-tableyout #android-tablayout

Вопрос:

У меня возникли проблемы с получением Toolbar и TabLayout для скрытия при прокрутке вверх. У меня есть 3 разных XML-файла: 1) Toolbar , 2) TabLayoutFragment (здесь у меня есть TabLayout и ViewPager , и я включаю toolbar сюда, и 3) HomeFragment (содержит RecyclerView ). Мне нужно, чтобы Toolbar скрывались при прокрутке вверх, и я видел во многих других сообщениях, что большинство людей используют CoordinatorLayout вместо Relative Layout или Linear Layout , а затем им приходится добавлять app:layout_scrollFlags="scroll|enterAlways" , что я и сделал, но я все еще не могу заставить Toolbar скрываться при прокрутке RecyclerView вверх.

Я также добавил это в RecyclerView , но по-прежнему ничего… app:layout_behavior="@string/appbar_scrolling_view_behavior"

Может кто-нибудь указать, чего здесь не хватает?

Панель инструментов

 <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@ id/toolbar_events"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#fff"
    android:fitsSystemWindows="true">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@ id/bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <androidx.appcompat.widget.Toolbar
            android:id="@ id/toolbar_home_fragment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#fff"
            app:contentInsetEnd="0dp"
            app:contentInsetLeft="0dp"
            app:contentInsetRight="0dp"
            app:contentInsetStart="0dp"
            app:contentInsetStartWithNavigation="0dp"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

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

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_centerVertical="true"
                    android:fontFamily="@font/scriptbl"
                    android:text="Events"
                    android:textColor="@color/colorBlack"
                    android:textSize="60sp" />

                <ImageView
                    android:id="@ id/search"
                    style="@style/SelectableIconThemeBackground"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentEnd="true"
                    android:layout_centerVertical="true"
                    android:layout_marginEnd="10dp"
                    android:contentDescription="@string/camera"
                    android:padding="10dp"
                    android:src="@drawable/icon_search" />

                <ImageView
                    android:id="@ id/filter"
                    style="@style/SelectableIconThemeBackground"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:layout_toStartOf="@ id/search"
                    android:contentDescription="@string/camera"
                    android:padding="10dp"
                    android:src="@drawable/icon10_sort" />

                <ImageView
                    android:id="@ id/options"
                    style="@style/SelectableIconThemeBackground"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentStart="true"
                    android:layout_centerVertical="true"
                    android:layout_marginStart="10dp"
                    android:contentDescription="@string/options"
                    android:padding="10dp"
                    android:src="@drawable/icon_short_text" />

            </RelativeLayout>

        </androidx.appcompat.widget.Toolbar>

    </com.google.android.material.appbar.AppBarLayout>

</androidx.coordinatorlayout.widget.CoordinatorLayout>
  

Фрагмент табличного описания

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/fragment_home_tab_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:tag="Home"
    tools:context=".Fragment.TabLayoutFragment">

    <include
        android:id="@ id/toolbar_events"
        layout="@layout/toolbar_events" />

    <com.google.android.material.tabs.TabLayout
        android:id="@ id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:background="#fff"
        app:layout_scrollFlags="scroll|enterAlways"
        app:tabIndicatorColor="#000"
        app:tabIndicatorFullWidth="false"
        app:tabRippleColor="@android:color/transparent"
        app:tabSelectedTextColor="@color/colorBlack"
        app:tabTextColor="@color/colorBlack" />

    <androidx.viewpager.widget.ViewPager
        android:id="@ id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#fff"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</LinearLayout>
  

Домашний фрагмент

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/fragment_home"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical"
    android:tag="fragment_home"
    tools:context=".Fragment.HomeFragment">

    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        android:id="@ id/refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@ id/toolbar">

            <TextView
                android:id="@ id/welcome"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="100dp"
                android:gravity="center"
                android:text="Welcome to Events!"
                android:textColor="#d9d9d9"
                android:textSize="36sp"
                android:visibility="gone" />

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

                <TextView
                    android:id="@ id/location"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:drawablePadding="5dp"
                    android:gravity="center_horizontal"
                    android:padding="8dp"
                    app:drawableStartCompat="@drawable/icon_loc" />

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@ id/recycler_view"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@ id/location"
                    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

            </RelativeLayout>

            <androidx.recyclerview.widget.RecyclerView
                android:id="@ id/recycler_view_following"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:visibility="gone"
                app:layout_behavior="@string/appbar_scrolling_view_behavior" />

        </RelativeLayout>

    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

</RelativeLayout>
  

Комментарии:

1. приложению: layout_behavior требуется макет координатора в качестве родительского, в котором содержится ваша панель инструментов, тогда только ваша панель инструментов поймет, для прокрутки какого макета ей нужно скрыть.

2. @SophiaGray итак, sI превратила родительский макет в CoordinatorLayout… Все остальное должно быть хорошо, как есть?

Ответ №1:

Вы можете сделать это программно, добавив addOnScrollListener метод.

В RecyclerView.SCROLL_STATE_DRAGGING методе скрывайте панель инструментов и табличное описание, а в RecyclerView.SCROLL_STATE_IDLE методе вы можете показать их снова, если захотите показать их снова.

Вы можете попробовать это таким образом:

 recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
        // Show your view again.. If you want to show them..
    } else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
        // Hide your view..
    }

    super.onScrollStateChanged(recyclerView, newState);

}});
  

Или вы можете использовать addOnScrollListener метод recycler view:

См.: addonscrollistener

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    if (dy > 0) {
        //Scrolling down
        // Show your controllers from here
    } else if (dy < 0) {
        //Scrolling up
        // Hide your controllers from here
    }
}});
  

Кроме того, вы можете добавить туда несколько анимаций, чтобы показывать и скрывать свою панель инструментов и макеты вкладок.

Комментарии:

1. Эй, спасибо за ваш ответ. Должен ли я сделать это в моем TabLayoutFragment? Я предполагаю…

2. Вы можете взять экземпляр вашей родительской активности и создать его, используя вот так: MainActivity.getInstance(). Табличное описание.настройка видимости (View.GONE);

3. Хорошо, я сделал это, но это работает странно. Это не выглядит привлекательным, когда вы прокручиваете, TabLayout исчезает, а затем, когда он простаивает, он появляется снова. Это выглядит совсем не привлекательно. Есть ли другое «состояние», при котором оно исчезает при прокрутке вверх и появляется снова при прокрутке вниз?

4. Для событий прокрутки вверх и прокрутки вниз вы также можете проверить это: developer.android.com/reference/androidx/recyclerview/widget / … или рассмотрим пример в следующем комментарии.

5. RecyclerView.addOnScrollListener (новый RecyclerView. onScrollListener() { @Переопределить общедоступную пустоту onScrolled(RecyclerView RecyclerView, int dx, int dy) { if (dy > 0) { //Прокрутка вниз } else if (dy < 0) { //Прокрутка вверх } } });

Ответ №2:

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

 <ScrollView>
   <Toolbar></Toolbar>
   <Tablayout></Tablayout>
</ScrollView>
  

Комментарии:

1. Должен ли я изменить свое линейное описание в TabLayoutFragment на ScrollView?