Как правильно скрыть и отобразить панель действий с помощью нового API библиотеки дизайна?
Фон
Предположим, что у меня есть эти элементы в активности:
- панель действий (фактически панель инструментов)
- вкладки (с помощью TabLayout)
- ViewPager с фрагментами.
- каждый фрагмент имеет ListView/RecyclerView.
Я хочу иметь такое же поведение, как и во многих приложениях, что при прокрутке панель действий будет скрываться или отображаться.
Прекрасным примером этого является то, как работает прокрутка Play Маркета.
Что-то вроде этого (но с ListView в фрагментах, конечно):
![введите описание изображения здесь]()
Проблема
Я нашел библиотеку Android-ObservableScrollView, которая показывает, как это сделать для многих типов прокрутки, но он не обрабатывает случай использования нового TabLayout (плюс его проблемы), как показано на более новых образцах, например cheesesquare.
В новом API-интерфейсе библиотеки дизайна (показанном на примере "cheesesquare" ) он более автоматический, поэтому вам не нужно создавать так много шаблонов для обработки прокрутки и что с ним делать.
Что-то вроде этого:
<android.support.v4.widget.DrawerLayout
<android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.AppBarLayout>
<android.support.v7.widget.Toolbar
app:layout_scrollFlags="scroll|enterAlways"/>
<android.support.design.widget.TabLayout/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton/>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView/>
</android.support.v4.widget.DrawerLayout>
Эта hirerchy promises, что snackbars будет ниже FAB, и что панель действий будет автоматически анимирована (показана/скрыта) на основе внутреннего RecyclerView фрагментов.
Thing, кажется, что работает только с RecyclerView, а не с ListView.
Так как они довольно сложны, будет очень сложно преобразовать их в RecyclverViews.
Вопрос
Что нужно сделать, чтобы этот механизм работал и для ListViews?
Есть ли способ сделать это? Если да, то как?
EDIT: похоже, Google не поддерживает это поведение для ListView, но только для RecyclerView и NestedScrollView (написано о здесь).
Итак, я попытался использовать библиотеку Android-ObservableScrollView, но в ней много проблемы с прокруткой, включая проблемы с отправкой.
Теперь я решил дать Android-ParallaxHeaderViewPager. Может ли кто-нибудь рассказать мне, как заставить его работать в текущем сценарии? Возможно ли это?
EDIT: я решил конвертировать в RecyclerView в конце концов.
Тем не менее, все образцы, которые я пробовал, показывают проблему: при остановке для прокрутки панель действий (и, возможно, даже FAB) может оставаться усеченной, в отличие от магазина воспроизведения, где она будет анимирована или скрыта/показана.
EDIT: Кажется, мне нужно использовать setExpanded при наличии IDLE для onScrollStateChanged. вопрос в том, как решить, когда развернуть и когда рухнуть.
Ответы
Ответ 1
Это приятное обходное решение, но оно по-прежнему отличается от того, что показывает Play Store:
для каждого фрагмента, вызовите что-то вроде этого:
recyclerView.addOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(final RecyclerView recyclerView, final int newState) {
super.onScrollStateChanged(recyclerView, newState);
((MainActivity) getActivity()).onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(final RecyclerView recyclerView, final int dx, final int dy) {
super.onScrolled(recyclerView, dx, dy);
((MainActivity) getActivity()).onScrolled(recyclerView, dx,dy);
}
});
для хостинговой деятельности:
public void onScrollStateChanged(final RecyclerView recyclerView, final int newState) {
switch (newState) {
case RecyclerView.SCROLL_STATE_IDLE:
mAppBarLayout.setExpanded(mLastDy <= 0, true);
mLastDy = 0;
break;
}
}
public void onScrolled(final RecyclerView recyclerView, final int dx, final int dy) {
mLastDy = dy == 0 ? mLastDy : dy;
}
Тем не менее, если кто-нибудь знает, как заставить его работать хорошо (используя ListView или RecyclerView для фрагментов), как и в Play-Store и других приложениях, напишите его.
Ответ 2
Новый API-интерфейс проекта предназначен только для новых компонентов. Если этот компонент будет поддерживать более старые версии, он должен работать для более старых версий.
Связано с вашей проблемой:
Я не знаю, использовали ли вы предлагаемую библиотеку или нет. Но это хорошо работает в моем случае. Я знаю, что это очень старая библиотека, и вам, вероятно, придется использовать listview с этим. Вы не можете реализовать recyclerview с этим. Но поскольку я хочу иметь очень гибкий и плавный эффект, я попробовал его, и он работает очень хорошо.
Вы также можете сделать гладкую прокрутку панели инструментов с прокруткой Listview, а также сделать эффект паралакса, как вы видели в примере.
Посмотрите это изображение для эффекта, который я внедрил для своего приложения.
Марк с красным цветом - это моя панель инструментов приложения.
Изображение при его расширении:
![введите описание изображения здесь]()
Изображение, когда оно свернуто:
![введите описание изображения здесь]()
Я предлагаю попробовать эту библиотеку для вашей проблемы, связанной с действиями, если вы не думаете, что измените свой список на recyclerview. Но если вы хотите изменить свой список на recyclerview, вы можете использовать новый API-интерфейс проекта для такого эффекта.
Сообщите мне, могу ли я помочь вам в этом случае.
С уважением,
Shreyash
Обновленный ответ
Я предполагаю, что вам нужно что-то вроде ЭТО.
Если это то, что вы хотите, тогда вам нужно будет отнести эту библиотеку и реализовать это.
Пожалуйста, обратитесь к части 1, части 2 и части 3 за аналогичный эффект.
Сообщите мне, если вам нужно что-нибудь еще.
Ответ 3
На основе решения разработчика @android, которое иногда расширяет панель приложений, когда список полностью прокручивается, я сделал небольшое изменение, расширяющее или свернувшее список в зависимости от прокрученной суммы (если она больше высоты заголовка, а затем расширяется).
mHeaderHeight = getResources().getDimensionPixelSize(R.dimen.appbar_height);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
switch (newState) {
case RecyclerView.SCROLL_STATE_IDLE:
mAppBar.setExpanded(mScrolledAmount < mHeaderHeight , true);
break;
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
mScrolledAmount += dy;
}
});
EDIT: Что работает для меня лучше, так это разные пороги для расширения и сглаживания
switch (newState) {
case RecyclerView.SCROLL_STATE_IDLE:
if (mScrolledAmount < 50){
mAppBar.setExpanded(true , true);
}
if (mScrolledAmount > mHeaderHeight) {
mAppBar.setExpanded(false, true);
}
break;
}