以编程方式设置 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】:说明
Behavior
是CoordinatorLayout.LayoutParams
的参数。您可以使用setBehavior
方法在CoordinatorLayout.LayoutParams
的实例上设置行为。
要获得与@string/appbar_scrolling_view_behavior
代表相同事物的正确Behavior
对象,您应该创建AppBarLayout.ScrollingViewBehavior
的实例。
示例
(这是我之前对原始答案的编辑的清理版本)
首先,您必须获得CoordinatorLayout
的子 View
的实例。
让我说清楚:它不是CoordinatorLayout
本身。 childView
是 CoordinatorLayout'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的主要内容,如果未能解决你的问题,请参考以下文章