gpt4 book ai didi

Android:单独 fragment 中的多个 snackbar (ViewPager)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:10 24 4
gpt4 key购买 nike

我有一个 viewpager,当然有一些 fragment 。这些 fragment 中的每一个都将 CoordinatorLayout 作为父级。

我正在展示某物的 snackbar 。问题是,如果 fragment A 显示一个 snackbar ,那没问题,但如果它的相邻 fragment B 也显示一个 snackbar , fragment A 中的 snackbar 会自动隐藏。

由于预加载了 viewpager 的相邻 fragment ,因此这是一个可见的问题。任何解决方法?还是我做错了?

最佳答案

ViewPager 中多个Fragment 中的snackbar 存在一些问题

1) 如果 snackbar 显示在 fragment A(可见)和 fragment B(不可见)上,则两个 snackbar 都不可见。

2) 如果我结合使用 @Override setUserVisibleHint 和 getUserVisibleHint() 来根据 fragment 可见性巧妙地显示和隐藏 snackbar ,它只在第一次工作。之后,调用 snackbar.show() 将无法再显示 snackbar(除非我重新创建 snackbar)。

以下是我提出的解决方案(使用 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:单独 fragment 中的多个 snackbar (ViewPager),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34465005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com