8

मेरे पास पाठ्यक्रम के कुछ टुकड़ों के साथ एक व्यूअरजर है। इन टुकड़ों में से प्रत्येक को कोऑर्डिनेटर लेआउट माता-पिता के रूप में होता है।एंड्रॉइड: अलग-अलग टुकड़ों में कई स्नैकबार (व्यूपेजर)

मैं कुछ के लिए स्नैकबार दिखा रहा हूं। समस्या यह है कि, अगर फ्रैगमेंट ए स्नैक्सबार दिखाता है तो यह ठीक है, लेकिन अगर यह निकटतम खंड बी है तो स्नैक्सबार स्नैक्सबार को खंड में दिखाता है स्वचालित रूप से छुपाता है।

चूंकि व्यूपेजर आसन्न टुकड़े प्रीलोड किए गए हैं, यह एक दृश्यमान मुद्दा है। कोई कामकाज? या मैं यह गलत कर रहा हूँ?

+0

हाय KalpitJain:

निम्नलिखित मेरे प्रस्तावित समाधान (v23.1.1 के साथ परीक्षण) है! क्या आपको जवाब मिल गया? मुझे भी यही समस्या हो रही है। – vijay

+0

यह 2 साल का है, मुझे बिल्कुल याद नहीं है। मुझे लगता है कि समाधान प्रत्येक टुकड़े में स्नैकबार में संदेश को बनाए रखने के लिए था - और जब भी यह विशेष टुकड़ा उपयोगकर्ता (और अन्य भी) के लिए दिखाई देता है तो इसे दिखाएं – TheKalpit

उत्तर

2

आप setUserVisibleHint(boolean isVisible) Snackbar दिखाने के लिए केवल तभी टुकड़ा दिखाई दे रहा है अपने टुकड़ा पर टुकड़ा दृश्यता (अपने ViewPager onPageSelected पर उदाहरण के लिए) और फिरgetUserVisibleHint() अद्यतन करने के लिए उपयोग कर सकते हैं।

कहते हैं कि तुम टुकड़े ए, बी & सी

टुकड़ा एक दिखाई दे रहा है और इतने टुकड़ा बी या सी एक Snackbar, getUserVisibleHint खोलने का प्रयास करते() अवास्तविक लौटाते हैं और वे गंदगी अभ्यस्त Snackbar है की सुविधा देता है फ्रैगमेंट ए स्नैकबार के साथ।

ओब्स। FragmentStatePagerAdapter के साथ ऐसा करने पर सावधान रहें क्योंकि आप एनपीई को फ्रैगमेंट्स के संदर्भों को संदर्भित कर सकते हैं और इस संदर्भ पर setUserVisibleHint() को कॉल कर सकते हैं।

संपादित करें: आपको setUserVisibleHint() की आवश्यकता नहीं है क्योंकि इसे पहले से ही सिस्टम द्वारा बुलाया गया है।

2

कुछ 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); 
    } 
} 
संबंधित मुद्दे