कुछ ViewPager
1) Snackbar टुकड़ा एक (दृश्यमान) और खंड बी (दिखाई नहीं) पर दिखाया जाता है में एक से अधिक टुकड़े में Snackbar के साथ समस्याओं, दोनों Snackbar दिखाई नहीं देता है।
2) अगर मैं @ ओवर्राइड सेट यूज़र विस्सिबलहिंट और getUserVisibleHint() के संयोजन का उपयोग करता हूं तो टुकड़े दृश्यता के आधार पर स्नैकबार को स्मार्ट शो को छुपाएं और छुपाएं, यह केवल पहली बार काम करता है। उसके बाद, snackbar.show() को कॉल करना अब स्नैकबार को दिखाने में विफल रहता है (जब तक मैं स्नैकबार को फिर से नहीं बना देता)।
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);
}
}
स्रोत
2016-02-20 07:02:07
हाय KalpitJain:
निम्नलिखित मेरे प्रस्तावित समाधान (v23.1.1 के साथ परीक्षण) है! क्या आपको जवाब मिल गया? मुझे भी यही समस्या हो रही है। – vijay
यह 2 साल का है, मुझे बिल्कुल याद नहीं है। मुझे लगता है कि समाधान प्रत्येक टुकड़े में स्नैकबार में संदेश को बनाए रखने के लिए था - और जब भी यह विशेष टुकड़ा उपयोगकर्ता (और अन्य भी) के लिए दिखाई देता है तो इसे दिखाएं – TheKalpit