我正在使用引入到appcompat / support-v7中的新工具栏小部件。 我想根据用户向上/向下滚动页面来隐藏/显示工具栏,就像在新的Google Play商店应用程序或NewsStand应用程序中一样。 工具栏小部件内置了这个功能吗?还是我应该将其与FrameLayout和ObservableScrollView结合使用?
我正在使用引入到appcompat / support-v7中的新工具栏小部件。 我想根据用户向上/向下滚动页面来隐藏/显示工具栏,就像在新的Google Play商店应用程序或NewsStand应用程序中一样。 工具栏小部件内置了这个功能吗?还是我应该将其与FrameLayout和ObservableScrollView结合使用?
onMainContentScrolled
。Toolbar
,只需像这样做:toolbar.animate().translationY(-toolbar.getBottom()).setInterpolator(new AccelerateInterpolator()).start();
如果您想再次显示它,您需要调用:
toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start();
private void showToolBar() { mToolBar.animate().translationY(0) .setInterpolator(new DecelerateInterpolator()).start(); }
- Shajeel Afzal你可以通过以下方式隐藏工具栏:
getSupportActionBar().hide();
所以你只需要添加滚动监听器,当用户滚动时隐藏工具栏!
隐藏:
getSupportActionBar().hide();
展示:
getSupportActionBar().show();
OnScrollListener
并在监听器中隐藏/显示工具栏即可。例如,如果您有listview/recyclerview/gridview,则可以按照示例操作。MainActivity Oncreate
方法中,初始化工具栏。 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
}
然后实现OnScrollListener
public RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
boolean hideToolBar = false;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (hideToolBar) {
((ActionBarActivity)getActivity()).getSupportActionBar().hide();
} else {
((ActionBarActivity)getActivity()).getSupportActionBar().show();
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 20) {
hideToolBar = true;
} else if (dy < -5) {
hideToolBar = false;
}
}
};
实际上,有很多种方法可以在滚动内容时隐藏/显示工具栏。其中一种方法是通过Android Design Support Library或更具体地通过协调布局(也称为超级帧布局)完成。
基本上,您只需要在布局文件中拥有以下结构,就可以实现所需的结果。
<CoordinatorLayout>
<AppBarLayout>
</AppBarLayout>
<NestedScrollView>
</NestedScrollView>
</CoordinatorLayout>
只需在工具栏中添加此属性,就可以完成操作。
app:layout_scrollFlags="scroll|enterAlways"
这不是很棒吗?
要隐藏特定片段的菜单:
``` setHasOptionsMenu(true); //Inside of onCreate in FRAGMENT:
@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.action_search).setVisible(false);
}
我一直在尝试实现相同的行为,这里是展示和隐藏工具栏的主要代码(放在包含RecyclerView的任何类中):
int toolbarMarginOffset = 0
private int dp(int inPixels){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, inPixels, getApplicationContext().getResources().getDisplayMetrics());
}
public RecyclerView.OnScrollListener onScrollListenerToolbarHide = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
toolbarMarginOffset += dy;
if(toolbarMarginOffset>dp(48)){
toolbarMarginOffset = dp(48);
}
if(toolbarMarginOffset<0){
toolbarMarginOffset = 0;
}
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)toolbar.getLayoutParams();
params.topMargin = -1*toolbarMarginOffset;
toolbar.setLayoutParams(params);
}
};
我已包含 dp 函数以将像素转换为 dp,但显然需要将其设置为您的工具栏高度。(用您的工具栏高度替换 dp(48))
在您设置 RecyclerView 的任何地方,包含以下内容:
yourListView.setOnScrollListener(onScrollListenerToolbarHide);
然而,如果您还使用SwipeRefreshLayout,则会出现一些额外的问题。
我不得不将RecyclerView适配器中的第一个元素的marginTop设置为Toolbar的高度加上原始偏移量。(我知道这有点像hack)。这样做的原因是我发现,如果我改变了上述代码以包括在滚动时更改recyclerView的marginTop,那么用户体验就会很差。所以这就是我克服它的方法。因此,基本上设置布局,使得工具栏浮动在RecyclerView的顶部(将其剪切)。类似于这样(在自定义RecyclerView适配器的onBindViewHolder中):
if(position==0){
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)holder.card.getLayoutParams();
// params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
params.topMargin = dp(10+48);
}
swipeLayout.setProgressViewOffset(true,dp(48),dp(96));
我希望这能对某些人有所帮助。这是我第一次详细回答,希望我的解答足够详细。
我实现了一个实用类,用于在滚动时执行整个隐藏/显示工具栏动画。您可以在此处查看文章 http://rylexr.tinbytes.com/2015/04/27/how-to-hideshow-android-toolbar-when-scrolling-google-play-musics-behavior/。源代码在这里https://github.com/rylexr/android-show-hide-toolbar。