#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?