15

मेरे पास एक टुकड़ा है जो नए कोऑर्डिनेटरलाउट/ऐपबारलाउट/कोलाप्सिंग टूलबार लेआउट पैराडाइम का उपयोग करता है, और मैं यह पता लगाने में सक्षम होना चाहता हूं कि ढहने वाली टूलबार पूरी तरह से विस्तारित होने पर मैं ऑपरेशन कर सकता हूं पूरे टुकड़े पर यह है, उदाहरण के लिए ढेर से टुकड़े टुकड़े करना और टुकड़े को खारिज करना, एक नए पर जा रहा है। मेरे पास खुलने वाला कोड काम कर रहा है, मुझे बस यह जानने की जरूरत है कि इसका कब और कब उपयोग नहीं किया जाए।पता लगाना जब AppBarLayout/CollapsingToolbarLayout पूरी तरह से विस्तारित है

मैंने AppBarLayout.OnOffsetChangedListener के साथ थोड़ा सा प्रयोग किया है, लेकिन इसमें बहुत भाग्य नहीं था। क्या चीजों को पूरी तरह से विस्तारित करने के लिए यह निर्धारित करने का कोई तरीका है, या क्या कोई और पसंदीदा तरीका है जिसके बारे में कोई जानता है?

अग्रिम धन्यवाद!

संपादित करें: मैं यह भी देखता हूं कि AppBarLayout.setExpanded(...) के लिए कुछ कार्यान्वयन हैं, हालांकि AppBarLayout.getExpanded() या कुछ समान नहीं है, इसलिए मैं वहां भी स्टंप हूं।

+0

शायद appBarLayout.addOnOffsetChangedListener मदद कर सकता है, लेकिन मैं यह छोटी गाड़ी propably मैं इसे सही ढंग से लागू नहीं किया था मिल गया। – mstrengis

+0

क्या आपको इसके लिए कोई समाधान मिला? जब टूलबार आंशिक रूप से ध्वस्त हो जाता है तो मैंने स्क्रॉलरफ्रेश लयआउट को रीफ्रेश करने से रोकने की कोशिश कर रहे एक ही समस्या में भाग लिया है। – Jimeux

उत्तर

26

ऐसा लगता है कि एपीआई में कुछ भी नहीं है, लेकिन निम्नलिखित मेरे लिए काम कर रहा है। इसे परीक्षण की आवश्यकता हो सकती है।

boolean fullyExpanded = 
    (appBarLayout.getHeight() - appBarLayout.getBottom()) == 0; 

संपादित करें: इसके बाद के संस्करण समाधान काम करने के लिए प्रतीत होता है, लेकिन जब से मैं इस स्थिति का परीक्षण करने जब AppBar स्क्रॉल किया गया था चाहता था, मैं OnOffsetChangedListener के साथ निम्न समाधान का उपयोग कर समाप्त हो गया।

class Frag extends Fragment implements AppBarLayout.OnOffsetChangedListener { 

    private boolean appBarIsExpanded = true; 
    private AppBarLayout appBarLayout; 

    @Override 
    public void onActivityCreated(Bundle state) { 
     super.onActivityCreated(state); 
     appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.app_bar); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     appBarLayout.addOnOffsetChangedListener(this); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     appBarLayout.removeOnOffsetChangedListener(this); 
    } 

    @Override 
    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
     appBarIsExpanded = (verticalOffset == 0); 
    } 

} 
+0

मैंने इस अवधारणा को त्याग दिया कि मैं इसे पहले स्थान पर क्यों करना चाहता था, लेकिन मैं आपके जवाब को स्वीकार करूंगा क्योंकि आप कहते हैं कि यह आपके लिए काम कर रहा है। धन्यवाद! –

+0

यह संकेत मेरे लिए भी काम कर रहा है। इंटरफ़ेस के कार्यान्वयन को जोड़ा गया है लेकिन यह –

+1

@ user1232726 कहलाता प्रतीत नहीं होता है आपको श्रोता को AppBarLayout में संलग्न करने की आवश्यकता है। मैंने कोड को ऐसा करने के तरीके से अपडेट किया। यदि आपको संभावित लीक की परवाह नहीं है, तो बस 'appBarLayout.setOnScrollChangeListener (this)' का उपयोग करके नौकरी होगी। – Jimeux

6

मेरा समाधान कस्टम दृश्य बनाने पर आधारित है। वर्ग के अंदर

public class CustomAppBar extends AppBarLayout { .... 

फिर सेट इस तरह एक addOnOffsetChangedListener: शायद एक विधि के अंदर फोन करके

this.addOnOffsetChangedListener... 

आप निर्माता में या इसके बाद के संस्करण की स्थापना करके ऐसा कर सकते हैं सबसे पहले एक वर्ग देशी AppBarLayout विस्तार बनाने कन्स्ट्रक्टर तो अगर आप की जरूरत है निर्माता, 2 पैरामीटर वाला निर्माता का उपयोग एक्सएमएल को जोड़ा गया करने में सक्षम होना करने के लिए याद रखें:

public CustomAppBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
//You can set the listener here or maybe call the method that set the listener 
} 

तो हम देखने का राज्य तक पहुंचने के लिए है, तो एक निजी बूलियन बनाने अपने कस्टम दृश्य वर्ग के अंदर है, और यह सच है या गलत पर सेट है, तो आपके विचार विस्तृत या संक्षिप्त शुरू करते हैं, इस मामले मेरे विचार डिफ़ॉल्ट रूप से है में विस्तार:

private boolean isExpanded = true; 

अब आप कि बूलियन के राज्य अपडेट करना पड़ता है:

this.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { 
      @Override 
      public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
       if (verticalOffset == 0) { 
        isExpanded = true; 
       } else { 
        isExpanded = false; 
       } 
      } 
     }); 

अगला चरण CustomAppBar वर्ग के भीतर एक गेटर का उपयोग करके बूलियन के राज्य पाने के लिए है

public boolean isExpanded() { 
     return isExpanded; 
    } 

अगले Acivity या टुकड़ा में, अपने xml करने के लिए जाना आपकी कस्टम दृश्य का उपयोग करें, तो है मिल दृश्य और, विधि का उपयोग AppBar स्थिति

+0

यह एक ओवरकिल जैसा लगता है जब आप सीधे 'OnOffsetChangedListener' को' AppBarLayout' उदाहरण 'में जोड़ सकते हैं। –

+0

यदि आप केवल उस ऐपबारलाउट का उपयोग कर रहे हैं: हाँ यह है। लेकिन यदि एक से अधिक गतिविधि को ऐपबारलायआउट राज्य को जानने की आवश्यकता है, तो: यह एक डीआरवाई समाधान है – cutiko

0

मैं जानता हूँ कि पता करने के लिए यह है कि शायद थोड़ी देर हो चुकी है, लेकिन AppBArLayout के स्रोत कोड की खोज मैं पाया है, कि AppBarLayout.OnOffsetChangedListener बस का मूल्य तब्दील int getTopAndBottomOffset() Ap पीबीआर का व्यवहार।

तो किसी भी समय आप सिर्फ इस कोड एक AppBarLayout विस्तार किया है या नहीं परिभाषित करने के लिए उपयोग कर सकते हैं:

public boolean isAppBArExpanded(AppBarLayout abl) { 
    final CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) abl.getLayoutParams()).getBehavior(); 
    return (behavior instanceof AppBarLayout.Behavior) ? (((AppBarLayout.Behavior) behavior).getTopAndBottomOffset() == 0) : false; 
} 
संबंधित मुद्दे