2016-03-25 8 views
8

मैं एंड्रॉयड समर्थन पुस्तकालय से नीचे शीट का उपयोग कर रहा इस तरह:एंड्रॉइड समर्थन BottomSheetBehavior गतिशील नहीं हो सकता है?

एक्सएमएल:

<LinearLayout 
    android:id="@+id/bottomSheetLinearLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/fourth_white" 
    android:orientation="vertical" 
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior" /> 

मैं LinearLayout के लिए बच्चे दृश्य जोड़:

bottomSheet.addView(actionButtonView); 

बाद मैं बच्चे को देखा गया जोड़ने के बाद , मैं BottomSheetBehavior प्रारंभ करता हूं और इसे विस्तारित करता हूं:

BottomSheetBehavior sheetBehavior = BottomSheetBehavior.from(bottomSheet); 
sheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 

यह काम नहीं करता कुछ भी नहीं दिखाता है। यहां तक ​​कि अगर मैं एक्सएमएल के अंदर लाइनरलाइट ऊंचाई को प्रीसेट करता हूं, तो यह सिर्फ सभी सफेद है।

यदि मैं XML में LinearLayout के अंदर सभी बच्चे के विचार जोड़ता हूं, तो सब कुछ ठीक काम करता है। जब मैं गतिशील रूप से विचारों को प्रोग्रामिक रूप से जोड़ने की कोशिश करता हूं तो यह काम नहीं करता है।

किसी के पास कोई समान समस्या थी?

+0

बेहतर समझने के लिए अपना कोड दिखाएं ... – Vickyexpert

+1

क्या आप पूरा कोड पोस्ट कर सकते हैं आप 'BottomSheet' पर विचार कैसे जोड़ते हैं? क्योंकि मैंने अभी पुन: उत्पन्न करने की कोशिश की है, और उस मुद्दे को नहीं मिला है। – rom4ek

+0

क्या आप बाहरी व्यू ग्रुप के लिए कोड पोस्ट कर सकते हैं जिसमें आप नीचे शीट जोड़ रहे हैं? यदि संभव हो तो इस व्यवहार को पुन: उत्पन्न करने के लिए पूर्ण पृथक कोड पोस्ट करें। क्योंकि @ rom4ek ने कहा कि मैं भी कहा गया मुद्दा –

उत्तर

1

यह के कार्यान्वयन से संबंधित BottomSheetBehavior पर गतिशील सामग्री के साथ मुसीबतों आकार गणना का विस्तार किया है। BottomSheetBehavior onayoutChild विधि में विस्तारित आकार की गणना करता है। लेकिन जब आप शीट लेआउट प्रक्रिया की सामग्री बदलते हैं तो एसिंक्रोनस लॉन्च होता है। भले ही आप RequestLayout या कुछ समान कहते हैं। तो कॉल का परिणाम इस तरह है:

  1. BottomSheetBehavior वर्ष विस्तृत आकार का है (आपके मामले में मुझे लगता है कि यह शून्य है)
  2. आप BottomSheet सामग्री जोड़ते हैं। विस्तारित आकार अभी भी पुराना है।
  3. आप सेटस्टेट को विस्तारित करने के लिए कहते हैं। BottomSheetBehavior अभी भी पुराने विस्तारित आकार को याद रखता है और उस आकार में एनीमेशन लॉन्च करता है। राज्य STATE_SETTLING में बदल गया!
  4. ऑनलाउट चाइल्ड कहा जाता है और नीचे की शीटबैवियर नए विस्तारित आकार की गणना करता है। लेकिन एनीमेशन पहले से ही प्रगति पर है और राज्य STATE_SETTLING है इसलिए BottomSheetBehavior अपना आकार
  5. एनीमेशन समाप्त नहीं करता है। नीचे की शीट का आकार पुराना है। राज्य विस्तारित हो गया लेकिन नीचे की शीटबैवियर "भूल गया" कि विस्तारित आकार एनीमेशन के दौरान बदल दिया गया था।

यह निश्चित रूप से BottomSheetBehaviour कार्यान्वयन की बग है।

अपने प्रोजेक्ट में मैं इस तरह के वैकल्पिक हल मिल गया:

private void showPanel(final View panelContent) { 
    if (panelBehavior.getState()!=BottomSheetBehavior.STATE_EXPANDED) { 
     panelBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { 
      @Override 
      public void onStateChanged(final View bottomSheet, int newState) { 
       if (newState==BottomSheetBehavior.STATE_EXPANDED) { 
        panelBehavior.setBottomSheetCallback(null); 
        contentView.removeAllViews(); 
        contentView.addView(panelContent); 
        panelView.setVisibility(View.VISIBLE); 

       } 
      } 

      @Override 
      public void onSlide(View bottomSheet, float slideOffset) { 

      } 
     }); 
     panelBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 
     return; 
    } 
    contentView.removeAllViews(); 
    contentView.addView(panelContent); 
    panelView.setVisibility(View.VISIBLE); 
} 

private void hidePanel() { 
    panelBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 
    panelView.setVisibility(View.GONE); 
    contentView.removeAllViews(); 
} 

तो आप नई सामग्री कॉल ShowPanel साथ BottomSheet दिखाने की जरूरत है। जब आपको BottomSheet कॉल hidePanel को पूरी तरह से छिपाने की आवश्यकता होती है (यदि आपको इसे अपनी प्रोजेक्ट में छिपाना होगा। यदि नहीं, तो आप विधियों से सेट दृश्यता को हटा सकते हैं)।

वर्कअराउंड का विचार नीचे की शीट की सामग्री को कभी भी परिवर्तित नहीं करना है जब BottomSheetBehavior विस्तारित स्थिति में नहीं है। अगर राज्य का विस्तार नहीं किया गया है तो इसे विस्तारित करने के लिए इसे बदलें, एनीमेशन समाप्त होने तक प्रतीक्षा करें और केवल तब सामग्री बदलें।

1

दृश्य के संदेश को कतार में runnable पोस्ट करने के लिए प्रयास करें:

bottomSheet.post(new Runnable() { 
    @Override 
    public void run() { 
     bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 
    } 
}); 

या retrolambda साथ:

bottomSheet.post(() -> bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED)); 
संबंधित मुद्दे