【问题标题】:How to dismiss Snackbar when user does any action?当用户执行任何操作时如何关闭 Snackbar?
【发布时间】:2016-04-30 16:15:50
【问题描述】:

我可以显示这样的小吃店。

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

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

【问题讨论】:

标签: android dismiss snackbar indefinite


【解决方案1】:

我假设您正在使用片段,因此您可以在片段主布局中设置一个 onTouchListener,并将其放入 snapbar.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();
                    }
                });

【讨论】:

    【解决方案2】:

    也许我找到了解决方案。我在我的视图组中添加了框架布局。谢谢节食者_h

    为覆盖 IntercepterTouchEvent 创建自定义 Framelayout 类

    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>
    

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 2016-07-06
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      相关资源
      最近更新 更多