1

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

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

在 Google 的 Component 文档中,在用法中说 Snackbar 的高度低于 DrawerLayout。

我尝试为我的 CoordinatorLayout 设置一个虚拟行为以防止它被滑动,但徒劳无功,就像在上一篇文章中讨论的那样

那么,在 DrawerLayout 内的 FrameLayout 中包裹的 Snackbar 怎么会出现在 DrawerLayout 的上方呢?有没有办法覆盖 CoordinatorLayout 中 Snackbar 的解除行为?

4

1 回答 1

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 显示后的行为,从而防止其被滑动。

于 2016-02-02T13:50:43.353 回答