CollapsingToolbarLayout प्रोग्रामेटिक रूप से संक्षिप्त करें या विस्तारित करें


158

आसान सवाल है, लेकिन मुझे कोई जवाब नहीं मिल रहा है। मैं CollapsingToolbarLayoutप्रोग्राम को कैसे ध्वस्त या विस्तारित कर सकता हूं ?

ढह गया टूलबार

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

विस्तारित टूलबार


1
मैं उसी चीज़ पर हैरान हो रहा था। उपयोगकर्ता द्वारा एम्बेडेड लेआउट (जैसे छवि) पर क्लिक करने के बाद टूलबार को फ़ुलस्क्रीन तक विस्तारित करना भी दिलचस्प हो सकता है।
मोरित्ज़

जवाबों:


321

समर्थन लाइब्रेरी v23 का उपयोग करके, आप कॉल कर सकते हैं appBarLayout.setExpanded(true/false)

आगे पढ़ने: AppBarLayout.setExpanded (बूलियन)


2
ठीक है, आप टिप के लिए धन्यवाद, लेकिन समर्थन v23 बहुत छोटी हैं, इसलिए मैं इसे अब परीक्षण नहीं कर सकता, क्योंकि मुझे 22.2.1 पर रहने की आवश्यकता है ....
टॉमस

अब आपके पास कुछ फिक्स के साथ 23.0.1 है
मारियो

6
क्या 23.1.1 के समर्थन के साथ एक कस्टम एनीमेशन को परिभाषित करना संभव है? setExpanded (बूलियन, सच) एक बहुत धीमी एनीमेशन है ...
निफेल

मेरे पास एक मुद्दा था जहां मेरे पास एक बंधनेवाला टूलबार और इसके तहत एक रिसाइक्लेव्यू के साथ एक लेआउट है। जब recyclerview से आइटम हटा रहे हैं तो टूलबार उचित रूप से व्यवहार नहीं करता था, इसलिए मैं ऐप बार लेआउट का विस्तार करूंगा और यह ठीक से काम करेगा। मैंने एनीमेशन के लिए appBarLayout.setExpanded (ट्रू, ट्रू) का उपयोग कर समाप्त किया।
रे हंटर

49

मैं टूलबार को ढहाने के लिए इस कोड का उपयोग करता हूं। अभी भी इसे विस्तारित करने का कोई तरीका नहीं मिल रहा है।

public void collapseToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.onNestedFling(rootLayout, appbarLayout, null, 0, 10000, true);
    }
}

संपादित 1: नकारात्मक वेग के साथ एक ही कार्य लेकिन टूलबार का विस्तार 100% नहीं है और अंतिम परम के लिए गलत काम करना चाहिए

public void expandToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.onNestedFling(rootLayout, appbarLayout, null, 0, -10000, false);
    }
}

संपादन 2: यह कोड मेरे लिए ट्रिक करता है

public void expandToolbar(){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbarLayout.getLayoutParams();
    behavior = (AppBarLayout.Behavior) params.getBehavior();
    if(behavior!=null) {
        behavior.setTopAndBottomOffset(0);
        behavior.onNestedPreScroll(rootLayout, appbarLayout, null, 0, 1, new int[2]);
    }
}
  • setTopAndBottomOffset टूलबार का विस्तार करें
  • onNestedPreScroll विस्तारित टूलबार के अंदर सामग्री दिखाते हैं

खुद से व्यवहार को लागू करने की कोशिश करेंगे।


2
यदि आप के अंतिम पैरामीटर सेट संपादित करें 1 भी काम करेंगे onNestedFlingकरने के लिए false
रिकी ली

2
params.getBehavior () अशक्त लौट रहा है। Xml में, लेआउट_behaviour टैग को NestedScrollView के सहारे सेट किया गया है, AppBarLayout पर नहीं। क्या आप मेरी मदद कर सकते हैं?
User31689 6

धन्यवाद। 1 कार्य को ठीक से संपादित करें, यदि अंतिम परम गलत है। :)
साइरलॉन

@GobletSky मैंने उसी समस्या का सामना किया। मेरे पास मेरे टुकड़े में NestedScrollView था और टुकड़ा सेट करने onNestedFling से पहले कॉल करने की कोशिश की । टुकड़ा सेट करने के बाद, मैं विधि को सफलतापूर्वक कॉल कर सकता था।
यूएसपी

@ पूरी तरह से, मेरी समस्या पूरी तरह से अलग थी (कुछ हद तक गलती)। इसे देखें: stackoverflow.com/questions/31067082/…
User31689

27

आप परिभाषित कर सकते हैं कि यह आपके कस्टम एनिमेटर के साथ कितना फैलता है या ढह जाता है। बस का उपयोग करें setTopAndBottomOffset(int)

यहाँ एक उदाहरण है:

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBar.getLayoutParams();
final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (behavior != null) {
    ValueAnimator valueAnimator = ValueAnimator.ofInt();
    valueAnimator.setInterpolator(new DecelerateInterpolator());
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            behavior.setTopAndBottomOffset((Integer) animation.getAnimatedValue());
            appBar.requestLayout();
        }
    });
    valueAnimator.setIntValues(0, -900);
    valueAnimator.setDuration(400);
    valueAnimator.start();
}

2
यह एकमात्र उत्तर है जो वास्तव में आपको कस्टम ऑफ़सेट को चेतन करने देता है। बहुत धन्यवाद!
गिलहर्मे टोरेस कास्त्रो

2
appBar.setExpanded (गलत, सत्य); (ओपन / क्लोज़, चेतन) आपको उन सभी पंक्तियों को लिखने की ज़रूरत नहीं है
पुण्य

2
@Puni के लिए, यदि आप एक "कस्टम" ऑफ़सेट का विस्तार / पतन करना चाहते हैं (जैसे कई चरणों को ध्वस्त करना), तो आपको इसकी आवश्यकता होगी।

यह कस्टम व्यवहार लिखने के लिए नहीं करना चाहते मामले में AppBar ऑफसेट चेतन करने के लिए सबसे अच्छा समाधान है। कोड स्निपेट के लिए एक अपडेट valueAnimator.setIntValues ​​() को व्यवहार के साथ कॉल करना है। वर्तमान ऐपबार ऑफसेट से चेतन शुरू करने के लिए 0 के बजाय।
रील

( -900 )valueAnimator.setIntValues- ( appBar.getTotalScrollRange() )
बेटर

12

मैंने एक छोटा सा विस्तार लिखा है AppBarLayout। यह CollapsibleToolbarLayoutएनीमेशन के साथ और बिना दोनों के विस्तार और पतन की अनुमति देता है । ऐसा लगता है कि यह काफी सही है।

इसे ट्राय करने के लिए स्वतंत्र महसूस करें।

बस अपने के बजाय इसका इस्तेमाल करते हैं AppBarLayout, और आप के विस्तार या पतन के लिए जिम्मेदार तरीके कह सकते हैं CollapsingToolbarLayout

यह मेरी परियोजना में बिल्कुल अपेक्षित रूप से काम कर रहा है, लेकिन आपको अपने लिए पूरी तरह से फिट होने के लिए perform...तरीकों (विशेष रूप से performExpandingWithAnimation()) में फ़्लिंग / स्क्रॉल मूल्यों को ट्विक करने की आवश्यकता हो सकती है CollapsibleToolbarLayout


@ सडेनो कृपया गीथब गिस्ट के रीडमेमड को पढ़ें। यह समर्थन पुस्तकालय के v23 के बाद से पदावनत है। समर्थन के v23 के बाद से (AndroidX के लिए आगे बढ़ना), में setExpandedविधि है AppBarLayout
बार्टेक लिपिंस्की

6

mAppBarLayout.setExpanded(true)टूलबार का विस्तार करने के लिए उपयोग करें और टूलबार mAppBarLayout.setExpanded(false)को संक्षिप्त करने के लिए उपयोग करें।

यदि आप CollapsingToolbarLayout ऊंचाई को प्रोग्रामेटिक रूप से बदलना चाहते हैं तो बस उपयोग करें mAppBarLayout.setLayoutParams(params);

विस्तार:

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*200; // HEIGHT

mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(true);

ढहने:

CoordinatorLayout.LayoutParams params =(CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
params.height = 3*80; // HEIGHT

mAppBarLayout.setLayoutParams(params);
mAppBarLayout.setExpanded(false);

1
इसने मेरी बहुत मदद की।
NoName

1
यह कितना मददगार है। धन्यवाद!
सूर्यलोक 3

5

उन लोगों के लिए जो onNestedPreScroll के साथ काम करना चाहते हैं और मेरी तरह त्रुटि प्राप्त करते हैं। मैं इस लाइन के साथ onCreate में NullPointerException प्राप्त करता हूं

    CoordinatorLayout coordinator =(CoordinatorLayout)findViewById(R.id.tab_maincontent);
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
    //below line
    params.setBehavior(new AppBarLayout.Behavior() {});

और इसके साथ ठीक से काम नहीं करता है। लेकिन मैं इस समस्या के साथ काम करते हैं

onCreate में:

        scrollToolbarOnDelay();

तथा...

    public void scrollToolbarOnDelay() {
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.tab_appbar);
                    CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.tab_maincontent);
                    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
                    AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
         if(behavior!=null)
                    behavior.onNestedPreScroll(coordinator, appBarLayout, null, 0, 100, new int[]{0, 0});
         else
            scrollToolbarOnDelay()
                }
            }, 100);


        }


0

यह विस्तार या पतन करने में मदद कर सकता है:

appBarLayout.setActivated(true);
appBarLayout.setExpanded(true, true);

0

मैं इस का उपयोग कर रहा हूँ

 private fun collapseAppbar() {
        scrollView.postDelayed(Runnable {
            scrollView?.smoothScrollTo(50, 50)
        }, 400)
    }

0

विस्तार से / AppBarLayout प्रोग्राम को ढहाने के लिए:

fun expandAppBarLayout(expand: Boolean, isAnimationEnabled: Boolean){
    appBarLayout.setExpanded(expand, isAnimationEnabled);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.