如何以编程方式显示/隐藏Google Material FloatingActionButton
我之前在使用Material 1.1.0版本的FloatingActionButton时,也碰到过和你一样的隐藏失效问题,试了好几种方法才解决,给你几个靠谱的方案:
方案一:使用立即隐藏的FLAG
这个版本的FAB默认隐藏会带有动画,但有时候动画逻辑会导致隐藏请求被拦截,你可以尝试添加FLAG_IMMEDIATE参数强制立即隐藏:
FloatingActionButton fab = findViewById(R.id.fab); fab.hide(FloatingActionButton.HideBehavior.FLAG_IMMEDIATE);
方案二:延迟执行隐藏操作
有时候视图还没完全初始化完成,直接调用隐藏方法会不生效,用post()把隐藏逻辑放到主线程消息队列末尾执行:
FloatingActionButton fab = findViewById(R.id.fab); fab.post(() -> { fab.setVisibility(View.GONE); // 也可以结合hide方法确保生效 fab.hide(FloatingActionButton.HideBehavior.FLAG_IMMEDIATE); });
方案三:检查并移除CoordinatorLayout Behavior
如果你的FAB是放在CoordinatorLayout里,并且设置了app:layout_behavior属性(比如和AppBar滚动联动的Behavior),这个Behavior可能会干扰FAB的隐藏逻辑。你可以尝试:
- 去掉布局文件中FAB的
app:layout_behavior属性 - 或者手动控制Behavior的隐藏逻辑:
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) fab.getLayoutParams(); params.setBehavior(null); fab.setLayoutParams(params); // 再执行隐藏 fab.hide();
方案四:关闭动画后再隐藏
如果是动画导致的视觉上没隐藏,你可以先关闭FAB的显示/隐藏动画,再执行隐藏:
fab.setShowAnimation(null); fab.setHideAnimation(null); fab.hide(); fab.setVisibility(View.GONE);
为什么会出现这个问题?
在Material 1.1.0版本中,FAB的隐藏逻辑和CoordinatorLayout的Behavior存在一些兼容性bug,当FAB关联了AppBar、Snackbar等组件时,Behavior可能会拦截隐藏请求,导致hide()或setVisibility()方法不生效。
内容的提问来源于stack exchange,提问作者KZoNE
相关产品推荐
相关产品推荐

