如何通过编程方式为工具栏设置app:layout_scrollFlags属性

70
我的应用程序有一个ViewPager和4个选项卡,每个选项卡都有许多片段。但是我只想在滚动2个特定选项卡中的RecyclerView时,使我的工具栏上下滚动。但我不知道如何阻止其他选项卡的工具栏滚动。我尝试为每个片段导入工具栏,但似乎我无法这样做。 有人有解决这个问题的想法吗?
3个回答

144

我强烈建议不要根据选定的标签更改滚动标志-当滚动到非RecyclerView标签时,工具栏自动返回(并且内容向下移动)可能会非常令人不适,并且可能不是您想要的交互模式(如果您的两个 RecyclerView 标签彼此相邻,则会变得更加恶化)。

但是,如果您想亲自查看它,可以使用 setScrollFlags()以编程方式设置滚动标志:

Toolbar toolbar = ... // your toolbar within an AppBarLayout
AppBarLayout.LayoutParams params = 
    (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
    | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);

为了清除标志

params.setScrollFlags(0)

33
谢谢。我不想这样做,但我的愚蠢客户想要这样做:D。 - Hoang Ha
2
在特定情况下,例如进入搜索模式(工具栏的ActionMode),使用滚动标志确实是有意义的。 - marmor
5
在支持版本25.3.1之后,需要调用 appBarLayout.requestLayout() 才能产生效果。 - Chaos
3
混乱似乎是正确的。您需要在视图上调用 #setLayoutParams(...)(它隐式调用了 requestLayout())或直接调用它。否则更改将不会产生任何效果。 - reVerse
1
需要添加 toolbar.setLayoutParams(params)。在工具栏上调用 setLayoutParams 是必要的,特别是在设置和清除滚动标志之间切换时才能使更改生效。 - itabdullah
显示剩余6条评论

15
// Show toolbar when we are in maps mode
AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) mToolbar.getLayoutParams();
CoordinatorLayout.LayoutParams appBarLayoutParams = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
if(isMapIndex) {
    params.setScrollFlags(0);
    appBarLayoutParams.setBehavior(null);
    mAppBarLayout.setLayoutParams(appBarLayoutParams);
} else {
    params.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS);
    appBarLayoutParams.setBehavior(new AppBarLayout.Behavior());
    mAppBarLayout.setLayoutParams(appBarLayoutParams);
}

0

为方便复制粘贴,这是 Kotlin 版本。应该可以与 core-ktx-1.8.0 库一起使用。

private fun SomeLayoutBinding.setScrollBehavior(enabled: Boolean) {
    appBarLayoutParams.updateLayoutParams<AppBarLayout.LayoutParams> {
        scrollFlags =
            if (enabled) AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL or AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS
            else 0
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接