2016-01-24 91 views
3

我可以显示这样的小吃店。如何在用户做任何动作时关闭Snackbar?

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(); 

我的小吃店有不确定的长度,我想要它。但是,当用户执行任何操作(例如滚动屏幕或触摸屏/视图)时,我想要关闭快餐栏。我可以找到一些图书馆和代码,但它们非常复杂。有没有简单的方法来解雇快餐吧?

+1

尝试使用[OnTouchListener](http://developer.android.com/reference/android/view/View.OnTouchListener.html) –

回答

4

我假设你正在使用片段,所以你可以设置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(); 
        } 
       }); 
0

也许我找到了解决方案。我在我的视图组中添加了framelayout。谢谢dieter_h

占优创建自定义的FrameLayout类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> 
相关问题