【问题标题】:Setting app:layout_behavior programmatically以编程方式设置 app:layout_behavior
【发布时间】: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_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>

【问题讨论】:

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


    【解决方案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 但我还不能以编程方式添加它。你碰巧知道怎么做吗?我在这里问了一个问题:stackoverflow.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

    【讨论】:

    • 一旦我们禁用布局行为,隐藏的底部导航视图会自动出现吗?
    猜你喜欢
    • 2021-11-21
    • 2018-11-26
    • 2011-04-18
    • 2012-07-18
    • 2014-07-26
    • 1970-01-01
    • 2011-06-06
    • 2012-02-12
    • 1970-01-01
    相关资源
    最近更新 更多