如何以编程方式为工具栏设置 app:layout_scrollFlags

Posted

技术标签:

【中文标题】如何以编程方式为工具栏设置 app:layout_scrollFlags【英文标题】:How to set app:layout_scrollFlags for Toolbar programmatically 【发布时间】:2015-08-26 13:55:03 【问题描述】:

我的应用有一个 viewpager 和 4 个标签,每个标签都有很多片段。但我只想让我的工具栏在 2 个特定选项卡中滚动 recyclerview 时向上/向下滚动。但我不知道如何阻止其他选项卡的工具栏滚动。我试图为每个片段导入工具栏,但似乎我做不到。 有人有解决这个问题的想法吗?

【问题讨论】:

【参考方案1】:

我强烈建议不要根据选择的选项卡更改滚动标志 - 滚动到非回收站视图选项卡时让工具栏自动返回(并且内容向下移动)可能非常不和谐,可能不是交互模式你想要的(如果你的两个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)

【讨论】:

谢谢。我不想那样做,但我愚蠢的客户想要它:D。 在进入搜索模式(工具栏的动作模式)等特定场景中使用滚动标志确实有意义 支持25.3.1后,需要调用appBarLayout.requestLayout()才能生效。 @Chaos 似乎是对的。您必须在您的视图上调用#setLayoutParams(...)(隐式调用requestLayout())或直接调用它。否则更改不会有任何效果。 需要加toolbar.setLayoutParams(params)。工具栏上的 setLayoutParams 是更改生效所必需的,尤其是在设置和清除滚动标志之间切换时【参考方案2】:
// 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);

【讨论】:

以上是关于如何以编程方式为工具栏设置 app:layout_scrollFlags的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式为一组 UIButtons 设置单独的背景图像

如何以编程方式获取操作栏后退按钮宽度?

如何以编程方式隐藏可绘制的权限

如何从 .NET 类中以编程方式访问服务器级 IIS 连接设置?

如何以编程方式设置 SpanSelector 小部件的最小值和最大值

如何以编程方式设置 Windows 音频平衡级别?