以编程方式设置app:layout_behavior

时间:2015-11-14 10:17:35

标签: android android-layout android-fragments material-design android-recyclerview

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

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

app:layout_behavior="@string/appbar_scrolling_view_behavior"

工作正常。但是,当我以编程方式创建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>

3 个答案:

答案 0 :(得分:80)

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

要获得与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();

你可能需要稍微调整一下(我还没有对它进行过测试,但它应该有效)。

编辑2:

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

上面示例中提到的

yourView NOT CoordinatorLayout本身。 yourViewCoordinatorLayout'sView

答案 1 :(得分:2)

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

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

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

第二个参数是AttributeSet,可以将其设为null,尽管它在支持lib中未标记为Nullable

答案 2 :(得分:1)

要通过 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