Android 如何以编程方式为工具栏设置app:layout\u滚动标志

Android 如何以编程方式为工具栏设置app:layout\u滚动标志,android,android-fragments,android-toolbar,android-coordinatorlayout,Android,Android Fragments,Android Toolbar,Android Coordinatorlayout,我的应用程序有一个viewpager和4个选项卡,每个选项卡都有许多片段。但我只想让我的工具栏上下滚动,同时在两个特定的选项卡中滚动recyclerview。但我不知道如何阻止其他选项卡的工具栏滚动。我试图为每个片段导入工具栏,但似乎我做不到。 有人有办法解决这个问题吗?我强烈建议不要根据选择的选项卡更改滚动标志-当滚动到非循环视图选项卡时,让工具栏自动返回(并向下移动内容)可能会非常不和谐,可能不是您想要的交互模式(如果您的两个RecyclerView选项卡相邻,则会感到恼火) 但是,如果要亲

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

我强烈建议不要根据选择的选项卡更改滚动标志-当滚动到非循环视图选项卡时,让工具栏自动返回(并向下移动内容)可能会非常不和谐,可能不是您想要的交互模式(如果您的两个
RecyclerView
选项卡相邻,则会感到恼火)

但是,如果要亲自查看,可以使用以编程方式设置滚动标志:

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()
才能生效。@混沌似乎是对的。您必须在视图上调用
#setLayoutParams(…)
(它隐式调用
requestLayout()
)或直接调用它。否则更改不会有任何效果。需要添加
工具栏。setLayoutParams(params)
。要使更改生效,工具栏上的setLayoutParams是必需的,尤其是在设置和清除滚动标志之间切换时
// 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);
}