如何在用户执行任何操作时关闭 Snackbar?
How to dismiss Snackbar when user does any action?
我可以这样展示小吃店。
Snackbar snackbar = Snackbar.make(this.findViewById(android.R.id.content), "snackbar", Snackbar.LENGTH_INDEFINITE)
.setAction("action", new View.OnClickListener() {
@Override
public void onClick(View v) {
// ...
}
});
snackbar.show();
我的小吃店有无限长,我想要它。但是当用户执行任何操作时,例如滚动屏幕或触摸 screen/view,我想关闭 snackbar。我可以找到一些库和代码,但它们太复杂了。有没有简单的方法来关闭小吃店?
我假设您正在使用片段,因此您可以为片段主布局设置一个 onTouchListener,然后放入 snackbar.dismiss()。
如果您只想在滚动时关闭,请设置一个 onScrollListener 并在事件中关闭快餐栏,这是 recyclerview onScroll 的一个实现:
list.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0)
snackbar.dismiss();
}
});
也许我找到了解决办法。我在我的视图组中添加了 framelayout。谢谢 dieter_h
正在创建自定义 Framelayout class 以覆盖 IntercepterTouchEvent
private class InterceptTouchEventLayout extends FrameLayout {
Snackbar mSnackbar;
public InterceptTouchEventLayout(Context context) {
super(context);
setLayoutParams(new CoordinatorLayout.LayoutParams(
CoordinatorLayout.LayoutParams.MATCH_PARENT,
CoordinatorLayout.LayoutParams.MATCH_PARENT));
}
public void setSnackbar(Snackbar snackbar) {
mSnackbar = snackbar;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
if (mSnackbar != null && mSnackbar.isShown()) {
mSnackbar.dismiss();
}
break;
}
return super.onInterceptTouchEvent(ev);
}
}
我的xml:
<FrameLayout
...>
<ScrollView .../>
<FrameLayout .../>
</FrameLayout>
通过
获取最上面的FrameLayout
View contentView = this.findViewById(android.R.id.content);
View framLayout = ((ViewGroup) contentView).getChildAt(0);
添加自定义布局的写法
private void addInterceptLayoutToViewGroup(Snackbar snackbar) {
View contentView = this.findViewById(android.R.id.content);
ViewGroup vg = (ViewGroup) ((ViewGroup) contentView).getChildAt(0);
if (!(vg.getChildAt(0) instanceof InterceptTouchEventLayout)) {
InterceptTouchEventLayout interceptLayout =
new InterceptTouchEventLayout(this);
interceptLayout.setSnackbar(snackbar);
for (int i = 0; i < vg.getChildCount(); i++) {
View view = vg.getChildAt(i);
vg.removeView(view);
interceptLayout.addView(view);
}
vg.addView(interceptLayout, 0);
} else {
InterceptTouchEventLayout interceptLayout =
(InterceptTouchEventLayout) vg.getChildAt(0);
interceptLayout.setSnackbar(snackbar);
}
}
所以,我可以这样使用!!!
Snackbar snackbar = Snackbar.make(this.findViewById(android.R.id.content), "text", Snackbar.LENGTH_INDEFINITE)
.setAction("action", new View.OnClickListener() {
@Override
public void onClick(View v) {
//...
}
});
snackbar.show();
addInterceptLayoutToViewGroup(snackbar);
老实说,我的解决方案改变了视图树(?)。在那之后,我的 xml 可能是..
<FrameLayout
...>
<InterceptTouchEventLayout
...>
<ScrollView .../>
<FrameLayout .../>
</InterceptTouchEventLayout>
</FrameLayout>
我可以这样展示小吃店。
Snackbar snackbar = Snackbar.make(this.findViewById(android.R.id.content), "snackbar", Snackbar.LENGTH_INDEFINITE)
.setAction("action", new View.OnClickListener() {
@Override
public void onClick(View v) {
// ...
}
});
snackbar.show();
我的小吃店有无限长,我想要它。但是当用户执行任何操作时,例如滚动屏幕或触摸 screen/view,我想关闭 snackbar。我可以找到一些库和代码,但它们太复杂了。有没有简单的方法来关闭小吃店?
我假设您正在使用片段,因此您可以为片段主布局设置一个 onTouchListener,然后放入 snackbar.dismiss()。
如果您只想在滚动时关闭,请设置一个 onScrollListener 并在事件中关闭快餐栏,这是 recyclerview onScroll 的一个实现:
list.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0)
snackbar.dismiss();
}
});
也许我找到了解决办法。我在我的视图组中添加了 framelayout。谢谢 dieter_h
正在创建自定义 Framelayout class 以覆盖 IntercepterTouchEvent
private class InterceptTouchEventLayout extends FrameLayout {
Snackbar mSnackbar;
public InterceptTouchEventLayout(Context context) {
super(context);
setLayoutParams(new CoordinatorLayout.LayoutParams(
CoordinatorLayout.LayoutParams.MATCH_PARENT,
CoordinatorLayout.LayoutParams.MATCH_PARENT));
}
public void setSnackbar(Snackbar snackbar) {
mSnackbar = snackbar;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
if (mSnackbar != null && mSnackbar.isShown()) {
mSnackbar.dismiss();
}
break;
}
return super.onInterceptTouchEvent(ev);
}
}
我的xml:
<FrameLayout
...>
<ScrollView .../>
<FrameLayout .../>
</FrameLayout>
通过
获取最上面的FrameLayoutView contentView = this.findViewById(android.R.id.content);
View framLayout = ((ViewGroup) contentView).getChildAt(0);
添加自定义布局的写法
private void addInterceptLayoutToViewGroup(Snackbar snackbar) {
View contentView = this.findViewById(android.R.id.content);
ViewGroup vg = (ViewGroup) ((ViewGroup) contentView).getChildAt(0);
if (!(vg.getChildAt(0) instanceof InterceptTouchEventLayout)) {
InterceptTouchEventLayout interceptLayout =
new InterceptTouchEventLayout(this);
interceptLayout.setSnackbar(snackbar);
for (int i = 0; i < vg.getChildCount(); i++) {
View view = vg.getChildAt(i);
vg.removeView(view);
interceptLayout.addView(view);
}
vg.addView(interceptLayout, 0);
} else {
InterceptTouchEventLayout interceptLayout =
(InterceptTouchEventLayout) vg.getChildAt(0);
interceptLayout.setSnackbar(snackbar);
}
}
所以,我可以这样使用!!!
Snackbar snackbar = Snackbar.make(this.findViewById(android.R.id.content), "text", Snackbar.LENGTH_INDEFINITE)
.setAction("action", new View.OnClickListener() {
@Override
public void onClick(View v) {
//...
}
});
snackbar.show();
addInterceptLayoutToViewGroup(snackbar);
老实说,我的解决方案改变了视图树(?)。在那之后,我的 xml 可能是..
<FrameLayout
...>
<InterceptTouchEventLayout
...>
<ScrollView .../>
<FrameLayout .../>
</InterceptTouchEventLayout>
</FrameLayout>