Как закрыть 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();

Моя закусочная имеет неопределенную длину, и я хочу ее. Но когда пользователь выполняет какие-либо действия, такие как прокрутка экрана или касание экрана/просмотра, я хочу закрыть закусочную. Я могу найти некоторые библиотеки и коды, но они такие сложные. Разве нет простого способа закрыть закусочную?


person illusionJJ    schedule 24.01.2016    source источник
comment
Попробуйте использовать OnTouchListener   -  person dieter_h    schedule 24.01.2016


Ответы (2)


Я предполагаю, что вы используете фрагменты, поэтому вы можете установить 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();
                    }
                });
person Eliahu Horwitz    schedule 24.01.2016

Может быть, я нашел решение. Я добавляю framelayout в свою группу просмотра. спасибо

Создание собственного класса 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>
person illusionJJ    schedule 24.01.2016