Android:在单独的片段中包含多个快餐栏(ViewPager) [英] Android: Multiple snackbars in separate Fragments (ViewPager)

查看:78
本文介绍了Android:在单独的片段中包含多个快餐栏(ViewPager)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个viewpager,当然也有一些片段.每个片段都有CoordinatorLayout作为父级.

I have a viewpager, with a few fragments of course. Each of these fragments have CoordinatorLayout as parent.

我正在为某事显示小吃店.问题是,如果片段A显示小吃店就可以了,但是如果它与相邻的片段B也显示小吃店,则片段A中的小吃店会自动隐藏.

I'm showing a snackbar for something. The problem is, if Fragment A shows a snackbar it's fine, but if it's adjacent fragment B also shows a snackbar the snackbar in fragment A automatically hides.

由于viewpager的相邻片段已预加载,因此这是一个明显的问题.任何解决方法?还是我做错了?

Since viewpager adjacent fragments are preloaded, it's a visible issue. Any workaround? Or am I doing it wrong?

推荐答案

在ViewPager的多个片段中,snapshbar存在一些问题

There is a few problems with snackbar in multiple Fragments in ViewPager

1)如果在片段A(可见)和片段B(不可见)上显示了小吃条,则两个小吃条都不可见.

1) If snackbar is shown on Fragment A (visible) and Fragment B (not visible), both snackbar is not visible.

2)如果我结合使用@Override setUserVisibleHint和getUserVisibleHint()来根据片段可见性巧妙地显示和隐藏小吃栏,则只能在第一次使用.此后,调用Snackbar.show()不再显示Snackbar(除非我重新创建了Snackbar).

2) If I use a combination of @Override setUserVisibleHint and getUserVisibleHint() to smartly show and hide snackbar depending on fragment visibility, it only work the first time. After that, calling snackbar.show() fail to show the snackbar anymore (unless I recreate the snackbar).

以下是我建议的解决方案(已通过v23.1.1测试):

The following is my proposed solution (tested with v23.1.1):

public class SnackbarManager {
    private static final String TAG = SnackbarManager.class.getName();

    private Snackbar snackbar;
    private Create instance;
    // private boolean isMultiSnackbar;

    public interface Create {
        Snackbar create();
    }

    public SnackbarManager(Create instance) {
        // why not pass in snackbar? coz snackbar.show will fail after 1st show (it multiple snackbar), thus need to recreate it
        snackbar = instance.create();
        this.instance = instance;
    }

    public void show(Fragment fragment) {
        if (fragment.getUserVisibleHint()) {
            snackbar.show();
        }
    }

    public void onSetUserVisibleHint(boolean isVisible) {
        if (isVisible) {
            if (snackbar == null) {
                snackbar = instance.create();
            }
            snackbar.show();
            Log.d(TAG, "showSnackbar="+snackbar.isShown());
            // if snackbar.isShown()=false, if means multiple snackbar exist (might or might not be in same fragment)
            /*
            boolean isMultiSnackbar = !snackbar.isShown();
            // the following is inaccurate when I manually dismiss one of the snackbar
            // even when isShown()=true, the snackbar is not shown
            if (isMultiSnackbar) {
                snackbar = null;
                snackbar = instance.create();
                snackbar.show();
            }
             */
            }
            else {
                Log.d(TAG, "dismissSnackbar");
                snackbar.dismiss();
                // subsequent show will fail, make sure to recreate next
                snackbar = null;
            }
        }
    }
}

public class TestFragment extends Fragment {
    private SnackbarManager snackbarManager;

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (snackbarManager != null)
            snackbarManager.onSetUserVisibleHint(isVisibleToUser);
    }

    public void showSnackbar() {
        snackbarManager = new SnackbarManager(new SnackbarManager.Create() {
            @Override
            public Snackbar create() {
                Snackbar snackbar = Snackbar.make(snackbarLayout, "Create your first moment ;)", Snackbar.LENGTH_INDEFINITE);
                snackbar.setAction("Create", new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        snackbarManager = null;
                    }
                });
                // enable following if not Snackbar.LENGTH_INDEFINITE
                /*
                snackbar.setCallback(new Snackbar.Callback() {
                    @Override
                    public void onDismissed(Snackbar snackbar, int event) {
                        super.onDismissed(snackbar, event);
                        snackbarManager = null;
                    }
                })
                */
                return snackbar;
            }
        });
        snackbarManager.show(this);
    }
}

这篇关于Android:在单独的片段中包含多个快餐栏(ViewPager)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆