以编程方式设置app:layout_behavior

And*_*idP 34 android android-layout android-fragments material-design android-recyclerview

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

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

app:layout_behavior="@string/appbar_scrolling_view_behavior"
Run Code Online (Sandbox Code Playgroud)

这很好.但是,当我以编程方式创建recyclerviews然后将它们添加到framelayout时,我完全不知道如何添加此行为:

<?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_width="match_parent"
    android:id="@+id/coordLayout"
    android:layout_height="match_parent" android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout android:id="@+id/app_bar"
        android:fitsSystemWindows="true" android:layout_height="@dimen/app_bar_height"
        android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay">

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

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_height="?attr/actionBarSize"
                android:layout_width="match_parent"
                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_width="match_parent"
        android:layout_height="wrap_content">

    </FrameLayout>

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

Bar*_*ski 89

Behavior是一个参数CoordinatorLayout.LayoutParams.您可以在CoordinatorLayout.LayoutParamswith setBehaviormethod 的实例上设置行为.

要获得一个Behavior代表相同内容的正确对象,@string/appbar_scrolling_view_behavior您应该创建一个实例AppBarLayout.ScrollingViewBehavior.


编辑1:

我没有一个例子,但我可以给你写一个.假设你有一个View(例如yourView)已经附加到CoordinatorLayout(因此它已经有LayoutParams).

CoordinatorLayout.LayoutParams params = 
                            (CoordinatorLayout.LayoutParams) yourView.getLayoutParams();
params.setBehavior(new AppBarLayout.ScrollingViewBehavior());
yourView.requestLayout();
Run Code Online (Sandbox Code Playgroud)

您可能需要稍微调整一下(我没有测试过,但它应该工作).


编辑2:

只是一个小小的免责声明,因为不是每个人似乎都完全理解这个例子.

yourView在上面的例子中提到的不是CoordinatorLayout本身.yourViewCoordinatorLayout's孩子View.


tas*_*iac 5

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

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

params.setBehavior(new AppBarLayout.ScrollingViewBehavior(view.getContext(), null));
Run Code Online (Sandbox Code Playgroud)

第二个参数是,尽管它没有在支持库中标记AttributeSet为,但拥有它也很好。nullNullable

  • 为什么我的答案中的代码不可编译?它似乎对我来说编译得很好? (2认同)

Kap*_*put 5

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

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
}
Run Code Online (Sandbox Code Playgroud)

注意:用您的视图替换 swipeRefreshView