如何在目标页面加载前显示SnackBar,消失后再执行页面跳转?
实现SnackBar显示后再跳转页面的方案
嘿,这个需求完全可以搞定!核心思路是利用SnackBar的回调监听它的消失事件,等SnackBar彻底消失后再执行页面跳转/返回操作。你提到的onSupportNavigateUp()和onBackPressed()确实是合适的代码放置位置,不过得调整原有逻辑,不能直接立即执行返回动作。
具体实现步骤
1. 修改onBackPressed()方法
把原来直接调用super.onBackPressed()的逻辑,改成先显示SnackBar,等它消失后再执行返回:
@Override public void onBackPressed() { // 先不要立即执行返回 // super.onBackPressed(); // 创建并显示SnackBar final Snackbar snackbar = Snackbar.make(parent_view_chapter, "Redirecting to another page....please wait", Snackbar.LENGTH_SHORT); // 添加消失回调,确保SnackBar消失后再跳转 snackbar.addCallback(new Snackbar.Callback() { @Override public void onDismissed(Snackbar snackbar, int event) { super.onDismissed(snackbar, event); // 当SnackBar完全消失后,执行页面返回 super.onBackPressed(); } }); snackbar.show(); }
2. 调整onSupportNavigateUp()方法
因为你的onSupportNavigateUp()默认调用了onBackPressed(),所以上面修改完onBackPressed()后,这个方法不需要额外改动就能生效。如果需要单独处理这个导航返回逻辑,也可以用同样的回调思路:
@Override public boolean onSupportNavigateUp() { // 先不直接调用返回 // onBackPressed(); final Snackbar snackbar = Snackbar.make(parent_view_chapter, "Redirecting to another page....please wait", Snackbar.LENGTH_SHORT); snackbar.addCallback(new Snackbar.Callback() { @Override public void onDismissed(Snackbar snackbar, int event) { super.onDismissed(snackbar, event); // 消失后执行页面返回 onBackPressed(); } }); snackbar.show(); return true; }
关键说明
- 为什么不能直接在
snackbar.show()后立即跳转?因为SnackBar的显示是异步的,LENGTH_SHORT的时长虽然固定(约2秒),但如果直接在show后调用跳转,页面会立刻切换,SnackBar根本来不及展示给用户。 - 使用
Snackbar.Callback的onDismissed方法,能确保只有在SnackBar彻底消失后,才会执行后续的页面操作,完美匹配你的需求。 - 要保证
parent_view_chapter是当前页面中有效的View(比如根布局或者某个已加载的View),否则SnackBar会无法正常显示。
内容的提问来源于stack exchange,提问作者Nere
相关产品推荐
相关产品推荐

