以编程方式设置 app:layout_behavior

Posted

技术标签:

【中文标题】以编程方式设置 app:layout_behavior【英文标题】:Setting app:layout_behavior programmatically 【发布时间】:2016-02-15 21:30:27 【问题描述】:

我有一个带有 recyclerview 的协调器布局,我想以编程方式添加它。以编程方式添加它的原因是因为膨胀协调器布局的不同片段可能使用不同类型的回收视图。

通常对于回收视图,为了设置此行为,我会将其添加到 xml 中:

app:layout_behavior="@string/appbar_scrolling_view_behavior"

效果很好。但是,当我以编程方式创建回收站视图然后将它们添加到框架布局时,我完全不知道如何添加此行为:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    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:layout_
    android:id="@+id/coordLayout"
    android:layout_ android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout android:id="@+id/app_bar"
        android:fitsSystemWindows="true" android:layout_
        android:layout_ android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/toolbar_layout"
            android:fitsSystemWindows="true" android:layout_
            android:layout_ app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:contentScrim="?attr/colorPrimary">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_
                android:layout_
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

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

    </android.support.design.widget.AppBarLayout>
    <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_
        android:layout_>

    </FrameLayout>

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

【问题讨论】:

【参考方案1】:

说明

BehaviorCoordinatorLayout.LayoutParams 的参数。您可以使用setBehavior 方法在CoordinatorLayout.LayoutParams 的实例上设置行为。

要获得与@string/appbar_scrolling_view_behavior 代表相同事物的正确Behavior 对象,您应该创建AppBarLayout.ScrollingViewBehavior 的实例。


示例

这是我之前对原始答案的编辑的清理版本

首先,您必须获得CoordinatorLayout View 的实例。 让我说清楚:它不是CoordinatorLayout 本身。 childViewCoordinatorLayout's 孩子。

//e.g. like this:
val childView: View = findViewById(R.id.child_view)

假设childView 已经附加到CoordinatorLayout(所以它已经有LayoutParams),你可以这样做:

val params: CoordinatorLayout.LayoutParams = yourView.layoutParams as CoordinatorLayout.LayoutParams
params.behavior = AppBarLayout.ScrollingViewBehavior()
yourView.requestLayout()

【讨论】:

你有一个以编程方式完成的例子吗? setBehavior 在加载我的片段时导致 xml 解析错误 .. 它不工作。在片段有自己的类和xml的情况下,我们怎么做呢?我注意到文档中有一个未记录的public AppBarLayout.ScrollingViewBehavior (Context context, AttributeSet attrs) 同样的行为可以应用于 LinearLayouts 但我还不能以编程方式添加它。你碰巧知道怎么做吗?我在这里问了一个问题:***.com/questions/38530196/… @BartekLipinski 可以yourView 成为ListView 而不是RecyclerView @Mark13426 我没有说任何关于RecyclerView 的内容,但我假设您在问ListView 是否也可以与CollapsingToolbarLayout 一起使用。答案是不。 CollapsingToolbarLayout 期望您使用实现NestedScrollingChild 接口的View。您可以自己实现它(对于ListView),但与使用RecyclerView 重新实现屏幕相比,这似乎很痛苦。【参考方案2】:

接受的答案是正确的,但提供的代码不可编译。所以这里有一个完整的例子

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) 
view.getLayoutParams();

params.setBehavior(new AppBarLayout.ScrollingViewBehavior(view.getContext(), null));

第二个参数是AttributeSet,尽管它在支持库中没有标记为Nullable,但可以将其设置为null

【讨论】:

为什么我的答案中的代码不可编译?它似乎对我来说编译得很好?【参考方案3】:

要使用 kotlin 以编程方式启用和禁用 layout_behavior,请使用以下代码:

fun enableLayoutBehaviour() 
    val param: CoordinatorLayout.LayoutParams = swipeRefreshView.layoutParams as CoordinatorLayout.LayoutParams
    param.behavior = AppBarLayout.ScrollingViewBehavior()


fun disableLayoutBehaviour() 
    val param: CoordinatorLayout.LayoutParams = swipeRefreshView.layoutParams as CoordinatorLayout.LayoutParams
    param.behavior = null

注意:用你的视图替换 swipeRefreshView

【讨论】:

一旦我们禁用布局行为,隐藏的底部导航视图会自动出现吗?

以上是关于以编程方式设置 app:layout_behavior的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式打开 Android 设置

如何以编程方式设置 UITableView 的高度

为啥我们不能在以编程方式设置初始视图控制器时以编程方式在视图控制器之间跳转?

以编程方式设置 UITabBar 标题

无法以编程方式将样式设置为 LinearLayout

如何以编程方式设置scrollview高度