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

Как правильно скрыть и отобразить панель действий с помощью нового 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. вопрос в том, как решить, когда развернуть и когда рухнуть.

4b9b3361

Ответ 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;
        }