我有一个viewpager,当然还有一些片段。这些片段中的每一个都以 CoordinatorLayout 作为父级。
我正在展示一个小吃栏。问题是,如果片段 A 显示小吃栏,那没问题,但如果它的相邻片段 B 也显示小吃栏,则片段 A 中的小吃栏会自动隐藏。
由于 viewpager 相邻片段是预加载的,因此这是一个明显的问题。有什么解决办法吗?还是我做错了?
ViewPager中多个Fragment中的snackbar存在一些问题
1) 如果snackbar显示在Fragment A(可见)和Fragment B(不可见)上,则两个snackbar都不可见。
2)如果我使用 @Override setUserVisibleHint 和 getUserVisibleHint() 的组合来根据片段可见性智能地显示和隐藏小吃栏,则它仅在第一次起作用。之后,调用 Snackbar.show() 无法再显示小吃栏(除非我重新创建小吃栏)。
以下是我建议的解决方案(使用 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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)