【问题标题】:Snackbar behavior in FrameLayout or CoordinatorLayout with a DrawerLayoutFrameLayout 或 CoordinatorLayout 中的 Snackbar 行为与 DrawerLayout
【发布时间】:2016-05-06 03:14:15
【问题描述】:
我想在一个包含 DrawerLayout 的 Activity 中创建一个不可滑动的 Snackbar。
要么我使用 FrameLayout 来包含我的 Snackbar,它在我绘制它时出现在 NavigationView 的顶部,或者我使用 CoordinatorLayout 并且它出现在下面,但它可以滑动。
In Google's Component documentation,用法中说Snackbar的高度低于DrawerLayout。
我尝试为我的 CoordinatorLayout 设置一个虚拟行为以防止它被滑动,但徒劳无功,就像在 this previous post 中讨论的那样。
那么,在 DrawerLayout 内的 FrameLayout 中包裹的 Snackbar 怎么会出现在 DrawerLayout 的上方呢?有没有办法覆盖 CoordinatorLayout 中 Snackbar 的解除行为?
【问题讨论】:
标签:
android
navigation-drawer
android-coordinatorlayout
android-snackbar
【解决方案1】:
我找到了一个解决方案来覆盖设置为 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 行为,从而防止它被刷卡了。