带有DrawerLayout的FrameLayout或CoordinatorLayout中的Snackbar行为

时间:2016-01-28 16:24:28

标签: android navigation-drawer android-coordinatorlayout android-snackbar

我想在包含DrawerLayout的活动中创建一个不可擦除的Snackbar。

我使用FrameLayout来包含我的Snackbar,当我绘制它时它出现在NavigationView的顶部,或者我使用CoordinatorLayout并且它出现在下面,但它变得可以滑动。

In Google's Component documentation,在用法中说,Snackbar的海拔低于DrawerLayout。

我徒劳地试图为我的CoordinatorLayout设置一个虚拟行为,以防止它被轻扫,就像在this previous post中所讨论的那样。

因此,如何在DrawerLayout中的FrameLayout中包含Snackbar出现在DrawerLayout上方?有没有办法覆盖CoordinatorLayout中Snackbar的解雇行为?

1 个答案:

答案 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行为,从而防止它被显示刷卡。