android - नए डिज़ाइन लाइब्रेरी एपीआई का उपयोग करके एक्शनबार को सही तरीके से कैसे छुपाएं और दिखाएं?




android-fragments android-listview (2)

पृष्ठभूमि

मान लीजिए कि मेरे पास गतिविधि में ये तत्व हैं:

  • एक्शनबार (वास्तव में एक टूलबार)
  • टैब (टैबलाउट का उपयोग करके)
  • खंडों के साथ ViewPager।
  • प्रत्येक खंड में ListVIew / RecyclerView है।

मैं कई ऐप्स पर एक ही व्यवहार करना चाहता हूं, जब स्क्रॉल करते समय, एक्शन बार छुपाएगा या दिखाएगा।

इसके लिए एक आदर्श उदाहरण यह है कि Play Store scrolling कैसे काम करता है।

ऐसा कुछ (लेकिन पाठ्यक्रम के टुकड़ों में ListView के साथ):

समस्या

मुझे " Android-ObservableScrollView ऑब्जर्जेबलस्क्रोल व्यू" लाइब्रेरी मिली है जो दिखाती है कि इसे कई प्रकार के स्क्रॉलिंग दृश्यों के लिए कैसे किया जाए, लेकिन यह नए नमूने पर दिखाए गए नए टैबलाउट उपयोग (इसके साथ ही इसमें समस्याएं हैं) के मामले को संभाल नहीं पाता है, cheesesquare तरह।

डिज़ाइन लाइब्रेरी के नए एपीआई पर ("चीजसेक्वेयर" उदाहरण पर दिखाया गया है), यह अधिक स्वचालित है इसलिए आपको स्क्रॉलिंग को संभालने और इसके साथ क्या करने के लिए इतना बॉयलरप्लेट बनाने की आवश्यकता नहीं है।

ऐसा कुछ:

<android.support.v4.widget.DrawerLayout

  <android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.AppBarLayout>

      <android.support.v7.widget.Toolbar
       app:layout_scrollFlags="scroll|enterAlways"/>

      <android.support.design.widget.TabLayout/>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
     app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <android.support.design.widget.FloatingActionButton/>

  </android.support.design.widget.CoordinatorLayout>

  <android.support.design.widget.NavigationView/>

</android.support.v4.widget.DrawerLayout>

यह किराया वादा करता है कि स्नैकबार एफएबी के नीचे होंगे, और यह कि कार्रवाई बार स्वचालित रूप से एनिमेटेड (दिखाया / छिपा हुआ) टुकड़ों के आंतरिक पुनर्चक्रण दृश्य के आधार पर होगा।

बात यह है कि, यह केवल RecyclerView के साथ काम करता है , और ListView के साथ नहीं।

चूंकि वे काफी जटिल हैं, इसलिए उन्हें पुनर्नवीनीकरण दृश्यों में परिवर्तित करना बहुत कठिन होगा।

प्रश्न

सूची दृश्यों के लिए उपर्युक्त तंत्र को काम करने के लिए क्या होगा?

क्या इसे करने का कोई तरीका है? यदि हां, तो कैसे?

संपादित करें: दुख की बात यह है कि ऐसा लगता है कि Google ListView के लिए इस व्यवहार का समर्थन नहीं करेगा, लेकिन केवल RecyclerView और NestedScrollView ( here बारे में लिखा गया here ) के लिए।

तो मैंने " Android-ObservableScrollView " लाइब्रेरी का उपयोग करने की कोशिश की है, लेकिन इसमें फ्लाईंग मुद्दों सहित कई स्क्रॉलिंग समस्याएं हैं।

अब मैंने Android-ParallaxHeaderViewPager देने का फैसला किया है। क्या कोई मुझे बता सकता है कि इसे वर्तमान परिदृश्य में कैसे काम करना है? क्या यह भी संभव है?

संपादित करें: मैंने सभी के बाद RecyclerView में कनवर्ट करने का निर्णय लिया है। हालांकि, मैंने कोशिश किए गए सभी नमूने एक मुद्दा दिखाते हैं: स्क्रॉल करने के लिए रोकते समय, एक्शनबार (और यहां तक ​​कि एफएबी) भी प्ले स्टोर के विपरीत, छोटा हो सकता है, जहां यह छुपा / दिखाया जा सकता है।

संपादित करें: ऐसा लगता है कि ऑनस्कोलस्टेट चेंज के लिए IDLE होने पर मुझे setExpanded का उपयोग करने की आवश्यकता है। प्रश्न यह है कि कैसे विस्तार करना है और कब गिरना है।


@Android डेवलपर समाधान के आधार पर जो कभी-कभी ऐप बार का विस्तार करता है जब सूची पूरी तरह से स्क्रॉल होती है, मैंने स्क्रॉल की गई राशि के आधार पर सूची में विस्तार या ढहने में एक छोटा बदलाव किया है (यदि यह हेडर ऊंचाई से बड़ा है तो विस्तार करें)।

mHeaderHeight = getResources().getDimensionPixelSize(R.dimen.appbar_height);

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        switch (newState) {
            case RecyclerView.SCROLL_STATE_IDLE:
                mAppBar.setExpanded(mScrolledAmount < mHeaderHeight , true);
                break;
        }
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        mScrolledAmount += dy;
    }
});

संपादित करें: मेरे लिए और भी बेहतर काम करता है कि विस्तार और पतन के लिए अलग-अलग सीमाएं हैं

     switch (newState) {
            case RecyclerView.SCROLL_STATE_IDLE:
                if (mScrolledAmount < 50){
                    mAppBar.setExpanded(true , true);
                }
                if (mScrolledAmount > mHeaderHeight) {
                    mAppBar.setExpanded(false, true);
                }
                break;
        }

नई डिजाइन एपीआई केवल नए घटकों के लिए हैं। यदि वह घटक पुराने संस्करणों का समर्थन करने जा रहा है तो इसे पुराने संस्करणों के लिए काम करना होगा।

आपकी समस्या से संबंधित: मुझे नहीं पता, क्या आपने सुझाई गई Android-ParallaxHeaderViewPager उपयोग किया है या नहीं। लेकिन यह मेरे मामले में अच्छी तरह से काम करता है। मुझे पता है कि इसकी एक बहुत पुरानी लाइब्रेरी है और आपको इसके साथ सूचीदृश्य का उपयोग करना होगा। आप इसके साथ recyclerview लागू नहीं कर सकते हैं। लेकिन जैसा कि मैं बहुत लचीला और चिकनी प्रभाव रखना चाहता हूं, मैंने इसे आजमाया है और यह बहुत अच्छी तरह से काम करता है।

आप सूचीदृश्य स्क्रॉलिंग के साथ टूलबार की चिकनी स्क्रॉल भी कर सकते हैं और उदाहरण में देखे गए पैरालेक्स प्रभाव भी बना सकते हैं।

इस ऐप को मेरे ऐप के लिए लागू किए गए प्रभाव के लिए देखें। लाल रंग के साथ मार्क ऐप का मेरा टूलबार है।

छवि का विस्तार होने पर:

जब यह ध्वस्त हो जाता है छवि:

मैं आपके लाइब्रेरी को रीसाइक्लिंगव्यू में बदलने के बारे में नहीं सोचता, तो आपके एक्शनबार से जुड़े मुद्दे के लिए उस पुस्तकालय को आजमाने का सुझाव देता हूं। लेकिन अगर आप अपनी सूचीदृश्य को पुनर्नवीनीकरण में बदलना चाहते हैं तो आप इस तरह के प्रभाव के लिए नए डिजाइन एपीआई का उपयोग कर सकते हैं।

अगर मैं इस मामले में आपकी मदद कर सकता हूं तो मुझे बताएं।

निष्ठा से,

Shreyash

अद्यतन उत्तर

मुझे लगता है कि आपको THIS तरह कुछ चाहिए।

यदि आप यही चाहते हैं, तो आपको इस library को संदर्भित करना होगा और इस तरह कार्यान्वित करना होगा।

कृपया इसी तरह के प्रभाव के लिए भाग 1, भाग 2 और part3 देखें।

आपको किसी और चीज़ की ज़रुरत हो तो मुझे बताएं।





android-design-library