Snackbar消失后界面底部残留白线问题求助
解决Snackbar消失后底部残留白线的问题
我之前开发时也碰到过一模一样的情况,结合你的布局和代码来看,这个白线大概率是自定义SnackbarBehavior的布局处理逻辑,或者Snackbar视图的背景设置导致的,给你几个针对性的解决办法:
1. 检查自定义SnackbarBehavior的实现
这是最可能的原因——如果你的SnackbarBehavior重写了onDependentViewChanged或者onDependentViewRemoved方法,要确保在Snackbar消失时,正确重置依赖视图(也就是你的root_container)的布局状态:
- 比如如果在Snackbar显示时,你给
root_container设置了底部偏移量,那在onDependentViewRemoved里一定要把这个偏移量重置为0; - 确认Behavior里没有留下多余的padding或者布局参数修改,导致Snackbar消失后布局没有回到原位。
2. 改用Snackbar官方API设置背景
你现在直接调用snackBarView.setBackgroundColor(darkerColor)覆盖了Snackbar的默认背景,可能导致隐藏时系统无法正确清理视图痕迹。建议换成官方的背景着色方法:
snackbar = Snackbar.make(findViewById(R.id.coordinator), "There's No Text", Snackbar.LENGTH_SHORT); // 用setBackgroundTint代替直接设置backgroundColor snackbar.setBackgroundTint(darkerColor); snackbar.show();
如果必须用直接设置背景的方式,那就在Snackbar消失后手动清理视图:
snackbar.addCallback(new Snackbar.Callback() { @Override public void onDismissed(Snackbar snackbar, int event) { super.onDismissed(snackbar, event); View snackBarView = snackbar.getView(); // 清空背景或者直接从父布局移除视图 snackBarView.setBackgroundColor(Color.TRANSPARENT); ((ViewGroup) snackBarView.getParent()).removeView(snackBarView); } });
3. 调整fitsSystemWindows属性的位置
你的CoordinatorLayout设置了android:fitsSystemWindows="true",这个属性有时候会和Snackbar的布局交互产生奇怪的空白。可以尝试把这个属性移到内部的root_container上:
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/coordinator" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".activities.MainActivity"> <RelativeLayout android:id="@+id/root_container" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" <!-- 移到这里 --> app:layout_behavior=".utils.SnackbarBehavior"> <!-- 其他布局内容 --> </RelativeLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
4. 强制刷新布局
之前的getWindow().getDecorView().invalidate()力度不够,试试在Snackbar消失后强制刷新CoordinatorLayout:
snackbar.addCallback(new Snackbar.Callback() { @Override public void onDismissed(Snackbar snackbar, int event) { super.onDismissed(snackbar, event); CoordinatorLayout coordinator = findViewById(R.id.coordinator); coordinator.requestLayout(); coordinator.invalidate(); } });
优先检查自定义Behavior的代码,这是这类问题最常见的根源,调整后应该就能解决底部白线的问题了。
内容的提问来源于stack exchange,提问作者darshan
相关产品推荐
相关产品推荐

