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

Hoa*_* Ha 57 android android-fragments android-toolbar android-coordinatorlayout

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

ian*_*ake 118

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

为了清除旗帜

params.setScrollFlags(0)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.我不想这样做,但我的愚蠢客户想要它:D. (24认同)
  • 在支持25.3.1之后,它需要调用`appBarLayout.requestLayout()`来生效. (5认同)
  • 在特定场景中使用滚动标记是有意义的,例如进入搜索模式时(工具栏的ActionMode) (2认同)
  • @Chaos 似乎是对的。您必须在视图上调用 `#setLayoutParams(...)`(隐式调用 `requestLayout()`)或直接调用它。否则更改将不会产生任何影响。 (2认同)

Den*_*erg 10

// 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);
}
Run Code Online (Sandbox Code Playgroud)