我想在包含DrawerLayout的活动中创建一个不可擦除的Snackbar。
我使用FrameLayout来包含我的Snackbar,当我绘制它时它出现在NavigationView的顶部,或者我使用CoordinatorLayout并且它出现在下面,但它变得可以滑动。
In Google's Component documentation,在用法中说,Snackbar的海拔低于DrawerLayout。
我徒劳地试图为我的CoordinatorLayout设置一个虚拟行为,以防止它被轻扫,就像在this previous post中所讨论的那样。
因此,如何在DrawerLayout中的FrameLayout中包含Snackbar出现在DrawerLayout上方?有没有办法覆盖CoordinatorLayout中Snackbar的解雇行为?
答案 0 :(得分:0)
我找到了一个解决方案来覆盖设置为Snackbar的默认解雇行为:
View rootView = findViewById(coordinatorLayoutId);
//Create Snackbar
Snackbar snackbar = Snackbar
.make(rootView, notificationTextId, Snackbar.LENGTH_INDEFINITE)
.setAction(actionTextId, clickListener)
.setCallback(new Snackbar.Callback() {
@Override
public void onShown(Snackbar snackbar) {
ViewGroup.LayoutParams rootViewGroupParams = view.getLayoutParams();
if (rootViewGroupParams instanceof CoordinatorLayout.LayoutParams) {
final CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) rootViewGroupParams;
params.setBehavior(null);
view.setLayoutParams(params);
}
});
因此,使用CoordinatorLayout作为根视图将获得DrawerLayout下的Snackbar,并重新定义Snackbar.Callback中的onShown()方法将允许在显示后重新定义CoordinatorLayout行为,从而防止它被显示刷卡。