Istnieje kilka problemów z bistrem w wielu fragmentów w ViewPager
1) W przypadku snack bar Pokazany na Fragment A (widzialnym) i Fragment B (nie pokazano), tak Snackbar nie jest widoczny.
2) Jeśli użyję kombinacji @Override setUserVisibleHint i getUserVisibleHint() do inteligentnego pokazywania i ukrywania paska nawigacyjnego w zależności od widoczności fragmentu, działa on tylko za pierwszym razem. Po tym, wywołanie snackbar.show() nie pokazuje już paska z przekąskami (chyba że ponownie utworzę pasek zakąsek).
co następuje moja proponowane rozwiązanie (testowane z 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);
}
}
Hi KalpitJain! Czy znalazłeś odpowiedź? Mam ten sam problem. – vijay
Ma 2 lata, nie pamiętam dokładnie. Wydaje mi się, że rozwiązaniem było utrzymanie wiadomości, która ma być wyświetlana w pasku adresu w każdym fragmencie - i pokazywanie jej, ilekroć ten konkretny fragment staje się widoczny dla użytkownika (i innych) – TheKalpit