【问题标题】:Where should 'app:layout_behavior' be set?'app:layout_behavior' 应该在哪里设置?
【发布时间】:2016-05-12 21:37:13
【问题描述】:

应该将其设置在AppBarLayout 同级的父级还是在其同级内的第一个可滚动视图中?


对于Material Design for Android,有Views 可以让我们根据其周围环境来处理布局的行为,其中之一是CoordinatorLayout,正如this CodePath guide 提到的那样:

CoordinatorLayout 扩展了完成许多 Google 的 Material Design 滚动效果。目前,有 此框架中提供的几种方法使其无需 需要编写自己的自定义动画代码。

我现在感兴趣的是:

  • 扩展或收缩工具栏或标题空间以为主要内容腾出空间。

因此,我们将AppBarLayoutToolbarapp:layout_scrollFlags 组一起使用,另一个ViewGroupAppBarLayout 同级与app:layout_behavior 一起使用。

我的问题是:我们应该把它放在哪个 ViewGroup(或者可能是 View)中 app:layout_behavior?


到目前为止,我已经尝试过(并且它们都工作,它们都是 AppBarLayout 的兄弟姐妹):

  • 滚动视图

  • 可滚动视图中的第一个 ViewGroup

  • ViewGroup 内的ScrollView

这个没用:

  • 没有 Scrollable View 子级的 ViewGroup。

网上有很多例子,但没有一个真正说明你应该把它放在哪里,比如:

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/

【问题讨论】:

    标签: android android-layout material-design android-coordinatorlayout vertical-scrolling


    【解决方案1】:

    查看此链接: 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 在此特定视图上发生滚动事件时。这 必须在触发事件的视图上建立行为。

    【讨论】:

    • “能够嵌套滚动的视图”我猜很重要,如果你在 recyclerView 上禁用 nestedScrolling 它就不起作用
    • @Jemshit Iskenderov 是对的,永远不会设置 recyclerView.setNestedScrollingEnabled(false);您只是在 AppBarLayout 之后使用回收器,或者您的回收器视图不在 NestedScrollView 内。
    【解决方案2】:

    确保您在 String.xml

    中添加了 appbar_scrolling_view_behavior 字段
    <!-- 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 答案。

    【讨论】:

    • 设计支持库已经定义了该字符串资源。在你自己的资源中重新定义它没有任何收获。
    • 也许你是对的。我忘记了,但我遇到了问题并在 string.xml 中添加后解决了它。
    【解决方案3】:

    app:layout_behavior 应设置为协调器布局的直接子视图

    【讨论】:

    【解决方案4】:

    AppBarLayout 还需要一个单独的滚动兄弟,以便 知道何时滚动。

    这个来自 Android 的描述非常不完整,导致我浪费了好几个小时。

    滚动兄弟是用词不当,不必是任何类型的滚动视图。

    例如,在我的AppBarLayout 下方,我使用ViewPager2 将呈现Fragment 将呈现Scrollview,因此我需要直接在ViewPager2 上设置app:layout_behavior="@string/appbar_scrolling_view_behavior"主布局,不是片段布局中深度嵌套的Scrollview

    我也没有用在屏幕上或屏幕上滚动 AppBarLayout 或其任何子项,所以我错误地认为我可以不设置 app:layout_behavior 任何地方。

    错误。

    这揭示了一个更隐蔽的问题:AppBarLayout 需要 滚动兄弟,是的。但不是只是“知道何时滚动”,而是实际调整兄弟姐妹的大小以适当地适应它旁边的屏幕!否则,兄弟姐妹将保持其配置的大小,并将在屏幕外向下轻推AppBarLayout!您甚至可以在 Android Studio 的布局编辑器中看到这一点。

    长话短说:如果您要使用AppBarLayout,您需要app:layout_behavior="@string/appbar_scrolling_view_behavior" 标记您的一个视图,无论它是否是滚动视图。

    【讨论】:

      【解决方案5】:

      我必须将以下内容添加到 gradle 文件中,否则会出现编译错误。

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

      希望这对其他人也有帮助!

      【讨论】:

        【解决方案6】:

        对于将CoordinatorLayoutFragmentContainerAppBarLayout 一起使用的人:

        • 在容器上也设置app:layout_behavior 非常好(不仅仅是NestedScrollViewRecyclerView)。它会删除FragmentContainer 不必要的底部边距,并保证在显示键盘时隐藏应用栏。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-19
          • 1970-01-01
          • 2010-10-26
          • 1970-01-01
          • 1970-01-01
          • 2015-10-27
          • 1970-01-01
          相关资源
          最近更新 更多