使用当前版本 (design-24.1.0),简单的修复看起来不可能,但有办法破解它(见下文)
在Snackbar内部,调用showView方法来显示snackbar
final void showView() {
[...]
if (ViewCompat.isLaidOut(mView)) {
if (shouldAnimate()) {
// If animations are enabled, animate it in
animateViewIn();
} else {
// Else if anims are disabled just call back now
onViewShown();
}
}
[...]
}
private boolean shouldAnimate() {
return !mAccessibilityManager.isEnabled();
}
showView 是最终的,所以我们不能做任何事情,而且我们不能触及任何决定小吃栏是否应该动画的代码。
关于动画本身,方法 animateViewIn 和 animateViewOut 都是私有的,里面的所有代码都依赖于私有字段或常量
编辑:
我模拟没有动画的方法是处理 Snackbar 的可见性
Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_INDEFINITE);
snackbar.getView().setVisibility(View.INVISIBLE);
[...]
snackbar.setCallback(new Snackbar.Callback() {
@Override
public void onShown(Snackbar snackbar) {
super.onShown(snackbar);
snackbar.getView().setVisibility(View.VISIBLE);
}
});
snackbar.show();
因为在我的情况下,我可以控制何时关闭 Snackbar,所以我可以这样做
snackbar.getView().setVisibility(View.GONE);
snackbar.dismiss();
不幸的是,我认为最后一步对于不确定的 Snackbar 来说并不容易。解决此问题的一种方法是在 LENGTH_SHORT 和 LENGTH_LONG
期间安排
setVisibility(View.INVISIBLE)
在 SnackbarManager 中。我们无法访问常量,但我们可以复制和粘贴
private static final int SHORT_DURATION_MS = 1500;
private static final int LONG_DURATION_MS = 2750;
然后在您的代码中,Callback.onShown()
handler.postDelayed(new Runnable() {
@Override
public void run() {
snackbar.getView().setVisibility(View.INVISIBLE);
}
}, LONG_DURATION_MS or SHORT_DURATION_MS)
我自己没有测试过,也许应该在onShown之前调用它。如果有人尝试过,请编辑帖子或在 cmets 中告诉我。