Где должно быть установлено «приложение: layout_behavior»?

Должен ли он быть установлен в родительском элементе AppBarLayout или в первый прокручиваемый вид внутри своего родного брата?


В Material Design для Android есть Представления, которые позволяют нам работать с поведением макета в зависимости от его окружения, одним из них является CoordinatorLayout, как в этом руководстве по CodePath упоминается:

CoordinatorLayout расширяет возможности реализации многих эффектов прокрутки Google Material Design. В настоящее время в этой структуре предусмотрено несколько способов, которые позволяют ей работать без необходимости писать собственный код анимации.

Меня сейчас интересует:

  • Расширение или сжатие панели инструментов или области заголовка, чтобы освободить место для основного содержимого.

Таким образом, мы будем использовать AppBarLayout с Панель инструментов с набором app:layout_scrollFlags и другим ViewGroup, родственный AppBarLayout с app:layout_behavior.

Мой вопрос: в какой именно ViewGroup (или, может быть, View) мы должны поместить этот app:layout_behavior?


До сих пор я пробовал (и все они работали, и все они являются родственными элементами AppBarLayout):

  • Просмотр с прокруткой

  • Первая ViewGroup внутри прокручиваемого представления

  • ScrollView внутри ViewGroup

А этот не сработал:

  • ViewGroup без дочерних элементов Scrollable View.

В Интернете есть несколько примеров, но ни один из них не указывает, где вы должны его поместить, например:

http://www.ingloriousmind.com/blog/quick-look-on-the-coordinatorlayout/ https://guides.codepath.com/android/Handling-Scrolls-with-CoordinatorLayout https://developer.android.com/training/basics/firstapp/building-ui.html https://www.bignerdranch.com/blog/becoming-material-with-android-design-support-library/




Ответы (6)


Проверьте эту ссылку: https://developer.android.com/reference/android/support/design/widget/AppBarLayout.html

AppBarLayout также требует отдельного элемента прокрутки, чтобы знать, когда прокручивать. Привязка выполняется через класс AppBarLayout.ScrollingViewBehavior, это означает, что вы должны установить поведение прокручиваемого представления как экземпляр AppBarLayout.ScrollingViewBehavior. Доступен строковый ресурс, содержащий полное имя класса.

Они упомянули об этом, это должно быть View, которое будет отображаться под AppBarLayout вот так:

<android.support.design.widget.CoordinatorLayout
         xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto"
         android:layout_width="match_parent"
         android:layout_height="match_parent">

     <android.support.v4.widget.NestedScrollView
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             app:layout_behavior="@string/appbar_scrolling_view_behavior">

         <!-- Your scrolling content -->

     </android.support.v4.widget.NestedScrollView>

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

         <android.support.v7.widget.Toolbar
                 ...
                 app:layout_scrollFlags="scroll|enterAlways"/>

         <android.support.design.widget.TabLayout
                 ...
                 app:layout_scrollFlags="scroll|enterAlways"/>

     </android.support.design.widget.AppBarLayout>

 </android.support.design.widget.CoordinatorLayout>

Мой вопрос: в какой именно ViewGroup (или, может быть, View) мы должны поставить этот app:layout_behavior?

И по этой ссылке: http://guides.codepath.com/android/Handling-Scrolls-with-CoordinatorLayout

Далее нам нужно определить связь между AppBarLayout и представлением, которое будет прокручиваться. Добавьте app:layout_behavior к RecyclerView или любому другому представлению, поддерживающему вложенную прокрутку, например NestedScrollView. Библиотека поддержки содержит специальный строковый ресурс @string/appbar_scrolling_view_behavior , который сопоставляется с AppBarLayout.ScrollingViewBehavior и используется для уведомления AppBarLayout о событиях прокрутки в этом конкретном представлении. Поведение должно быть установлено в представлении, которое запускает событие.

person ʍѳђઽ૯ท    schedule 03.02.2016
comment
Вид, способный к вложенной прокрутке, важен, я думаю, если вы отключите вложенную прокрутку на recyclerView, это не сработает. - person Jemshit Iskenderov; 04.12.2017
comment
@Jemshit Искендеров прав, никогда не устанавливайте recyclerView.setNestedScrollingEnabled(false); вы просто используете переработчик после AppBarLayout, или ваше представление переработчика не находится внутри NestedScrollView. - person Surjit Singh; 02.02.2018

Убедитесь, что вы добавили поле appbar_scrolling_view_behavior в файл String.xml.

<!-- The class name to the ScrollingChildBehavior required for AppBarLayout -->
<string name="appbar_scrolling_view_behavior" translatable="false">android.support.design.widget.AppBarLayout$ScrollingViewBehavior</string>

И, как все знают, мы можем использовать это, как показано ниже.

<android.support.v7.widget.RecyclerView
        android:id="@+id/rvSomeList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

Это просто для информации, а не для ответа OP.

person Ranjit    schedule 20.01.2017
comment
Библиотека поддержки дизайна уже определяет этот строковый ресурс. Ничего не получится, переопределив его в своих собственных ресурсах. - person Ted Hopp; 21.12.2017
comment
Может быть, вы правы. Я забыл, но столкнулся с проблемой и решил ее, добавив это в string.xml. - person Ranjit; 21.12.2017

app:layout_behavior следует установить для тех представлений, которые являются прямыми дочерними элементами макета координатора.

person ishwor kafley    schedule 03.02.2016
comment
Что такое макет координатора на самом деле? Пожалуйста, не возражайте .., я немного новичок в разработке Android. - person eRaisedToX; 06.04.2017
comment
@eRaisedToX Это не что иное, как FrameLayout с некоторыми дополнительными функциями. Проверьте это один раз developer.android.com/reference/android/support/design/widget/ - person Ranjit; 21.12.2017
comment
Также SwipeRefreshLayout - person btraas; 05.03.2021

Мне пришлось добавить следующее в файл gradle, иначе это дало мне ошибку компиляции.

implementation 'com.google.android.material:material:1.0.0'

Надеюсь, это поможет и другим!

person Pei    schedule 20.10.2019

Для тех, кто использует CoordinatorLayout с FragmentContainer и AppBarLayout:

  • Очень хорошо установить app:layout_behavior также и на контейнере (а не только на NestedScrollView или RecyclerView). Он удаляет ненужное нижнее поле FragmentContainer и гарантирует, что панель приложения скрывается при отображении клавиатуры.
person Vít Kapitola    schedule 31.07.2020

AppBarLayout также требует отдельного элемента прокрутки, чтобы знать, когда прокручивать.

Это описание с Android ужасно неполное и стоило мне часов потраченного впустую времени.

Прокручивающийся одноуровневый элемент – это неправильное название, и он не обязательно должен быть представлением с прокруткой любого типа.

Например, ниже моего AppBarLayout я использую ViewPager2, который будет отображать Fragment, который будет отображать Scrollview, поэтому мне нужно было установить app:layout_behavior="@string/appbar_scrolling_view_behavior" непосредственно на ViewPager2 в основном макете, НЕ глубоко вложенный Scrollview в макете фрагмента.

Мне также не нужно прокручивать AppBarLayout или любой из его дочерних элементов на экране или за его пределами, поэтому я ошибочно предположил, что могу уйти, не устанавливая app:layout_behavior где-либо.

Неверно.

Это раскрывает более коварную проблему: AppBarLayout требуется прокручивающийся брат, да. Но не просто знать, когда прокручивать, а на самом деле настроить размер родственного элемента, чтобы он правильно помещался на экране рядом с ним! В противном случае родственный брат сохранит свой настроенный размер и будет сдвинут вниз за пределы экрана на высоту AppBarLayout! Вы даже можете увидеть это в редакторе макетов Android Studio.

Короче говоря: если вы собираетесь использовать AppBarLayout, вам необходимо пометить одно из ваших представлений app:layout_behavior="@string/appbar_scrolling_view_behavior", независимо от того, является ли оно представлением с прокруткой или нет.

person rmirabelle    schedule 07.03.2021
comment
Этот ответ помог мне, спасибо! - person Evtim Georgiev; 23.07.2021