NestedScrollView में ViewPager


111

मुझे Google न्यूज़स्टैंड जैसा एक इंटरफ़ेस बनाने की आवश्यकता है जो कि एक ढहने वाले शीर्षलेख (वर्टिकल स्क्रॉल) पर एक प्रकार का ViewPager (क्षैतिज स्क्रॉल) है। मेरी आवश्यकताओं में से एक Google IO 2015 में प्रस्तुत नई डिज़ाइन सहायता लाइब्रेरी का उपयोग करना है ( http://android-developers.blogspot.ca/2015/05/android-design-support-library.html )

क्रिस बेंस ( https://github.com/chrisbanes/cheesesquare ) द्वारा बनाए गए नमूने के आधार पर, मैं इस बिंदु पर पहुंच गया हूं कि मैं ढहने वाले व्यवहार को करने में सक्षम हूं लेकिन एक बुनियादी रैखिकलेयूट (क्षैतिज स्क्रॉल के बिना) के साथ।

मैंने एक ViewPager द्वारा लिनियरलाईट को बदलने की कोशिश की और मुझे एक रिक्त स्क्रीन मिली। मैंने साथ खेला: चौड़ाई, वजन और सभी प्रकार के दृश्य समूह लेकिन .... फिर भी एक रिक्त स्क्रीन। ऐसा लगता है कि ViewPager और NestedScrollView एक दूसरे को पसंद नहीं करते हैं।

मैंने एक क्षैतिज क्षैतिज दृश्य का उपयोग करके वर्कअराउंड की कोशिश की: यह काम करता है, लेकिन मैंने पेजरटाइटलस्ट्रिप सुविधा का लाभ और एक पैनल पर ध्यान केंद्रित किया है (मैं 2 पैनलों के बीच क्षैतिज रूप से रोक सकता हूं)।

अब मेरे पास और कोई विचार नहीं है, अगर कोई मुझे समाधान के लिए ले जा सकता है ...

धन्यवाद

यहाँ मेरी नवीनतम लेआउट फ़ाइल है:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/header_height"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <include
                layout="@layout/part_header"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar
                android:id="@+id/activity_main_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

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

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/activity_main_nestedscrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.v4.view.ViewPager
            android:id="@+id/activity_main_viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFA0"/>


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

क्या आपने अपने ViewPagerअंदर लपेटने की कोशिश की है LinearLayout? बस उत्सुक है कि अगर ViewPagerठीक से प्रस्तुत करना होगा ।
CzarMatt

हां मैंने कोशिश की लेकिन फिर भी वही परिणाम। मैंने कई घटकों के साथ कई परीक्षण किए, लेकिन ViewPager ने NestedScrollView में कभी भी कोई पदानुक्रम नहीं दिया है
Kyso84

मैं सिर्फ एक लेआउट के रूप में ViewPagerअंदर के साथ एक परीक्षण एप्लिकेशन बनाया NestedScrollView- ठीक काम करने के लिए लग रहा था। मैं भी DrawerLayoutसफलतापूर्वक सफल रहा। शायद आपके कोड का एक और पहलू है जिसे आप चाहते हैं कि कार्यक्षमता को रोकना। अपने स्रोत को अधिक साझा करने के लिए देखभाल?
CzarMatt

वाह, तो आप बाएं / दाएं और ऊपर / नीचे स्वाइप करने में सक्षम हैं? मैं बस अपने पेजर में टुकड़े प्रदर्शित करने के लिए एक FragmentPagerAdapter का उपयोग करता हूं। क्या आप इसके बजाय अपना नमूना कोड साझा कर सकते हैं?
Kyso84

मैंने यहां एक सरल उदाहरण लेआउट चिपकाया: pastebin.com/jXPw6mtf संपादित करें: आप जो भी टुकड़ा चाहते हैं उसे लोड कर सकते हैं ViewPager। मैं विचारों को ऊपर और नीचे स्क्रॉल करने में सक्षम हूं, साथ ही ViewPagerबाएं / दाएं स्क्रॉल कर सकता हूं ।
सीजरमैट

जवाबों:


128

मैं इस समस्या को पूरा करता हूं, मैं इसे हल करता हूं setFillViewport (true)

<android.support.v4.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/nest_scrollview"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="mio.kon.yyb.nestedscrollviewbug.ScrollingActivity"
tools:showIn="@layout/activity_scrolling">


    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

गतिविधि में

  NestedScrollView scrollView = (NestedScrollView) findViewById (R.id.nest_scrollview);
    scrollView.setFillViewport (true);

यहां छवि विवरण दर्ज करें


31
ध्यान दें कि यह एक्सएमएल में रूप में अच्छी तरह सेट किया जा सकता है, बस जोड़ने android:fillViewport="true"के लिए NestedScrollViewवस्तु। प्रलेखन के रूप में इस विशेषता का वर्णन करता है Defines whether the scrollview should stretch its content to fill the viewport.
Krøllebølle

7
यह प्लेसहोल्डर अंशों में स्क्रॉलिंग समस्या का समाधान नहीं करता है
Atieh

3
धन्यवाद! मैं बैठ गया है android:fillViewport="true"पर NestedScrollViewऔर अंदर fragmentमैं एक listViewमैं कहाँ बैठे थे android:nestedScrollingEnabled="true".. स्क्रॉल मुद्दा फिक्स्ड
radubogdan

@ Krøllebølle NestedScrollView में यह विशेषता नहीं है, आपको इसे प्रोग्रामेटिक रूप से सेट करना होगा।

हाँ, यह मेरे लिए काम करता है। मुझे एक समस्या है जब मैंने NestedScrollView के अंदर match_parent के लिए viewpager की ऊँचाई सेट की, यह दृश्य नहीं दिखा रहा था।
वहीद नाज़िर

71

ठीक है, मैं के साथ एक छोटे डेमो बनाया ViewPagerऔर NestedScrollView। जिस समस्या का मुझे सामना करना पड़ा उसकी ऊंचाई ViewPagerऔर साथ थी ListView। इसलिए मैंने थोड़ी ऊंचाई पर ListViewऔर ViewPager'sऊंचाई को मापने का काम किया।

यदि कोई इस कोड को देखना चाहता है, तो यहाँ लिंक है: https://github.com/TheLittleNaruto/SupportDesignExample/

आउटपुट:

यहां छवि विवरण दर्ज करें


काम नहीं कर रहा है, अगर टुकड़ा नहीं है, तो सूची है, यहां तक ​​कि अपने काम को भी सूचीबद्ध करें अगर सामानों की गिनती की संख्या समान टुकड़ों के लिए समान है।
पंकज अरोड़ा

3
मैं एक हो सकता है थोड़ा पार्टी के लिए देर हो चुकी है, लेकिन, मैं इस पर काम कर रहा आज किया गया था, और मुझे मिल गया (अधिकतर) जोड़ने एप्लिकेशन के साथ काम: layout_behavior = "@ स्ट्रिंग / appbar_scrolling_view_behavior" दोनों ViewPager पर और के जनक दृश्य पर प्रत्येक टुकड़ा।
ग्रीम

1
इसमें कोई संदेह नहीं है कि यह काम करता है, लेकिन क्या यह इस मुद्दे को ओवरकंप्लीकेट नहीं कर रहा है? मैंने इसे हल करने NestedScrollViewऔर LinearLayoutइसके बजाय उपयोग करने से हल किया । यदि पूरे उद्देश्य से ViewPager में सामग्री को स्क्रॉल करना है तो NestedScrollViewओवर होने के क्या लाभ होंगे LinearLayout? कृपया मुझे सुधारें अगर मैं गलत हूं। : एक्स
थैंक्स

1
आपको बहुत - बहुत धन्यवाद! मैं अपने बालों को बाहर खींचने के बिंदु पर था, और आपका WrapContentHeightViewPager एक आकर्षण की तरह काम करता है। मैं आपका आभारी हूं!
मावामार्टन

1
सही समाधान। धन्यवाद। यह मेरे लिए काम किया .. :)
Mrunal

42

android:fillViewport="true"अपने में जोड़ें NestedScrollView। अवधि।


2
यह समस्या को हल करता है, लेकिन व्यूपेयर की ऊँचाई मैच पैरेंट होगी (यह पूरे पृष्ठ की ऊँचाई को ले जाती है)।
मनुकुमार

27

NestedScrollView के अंदर ViewPager रखने के बजाय, इसे दूसरे तरीके से करें।

NestedScrollView को ViewPager के अंदर बच्चे के दृश्य में रखें, जो संक्षेप में Fragment का लेआउट है। यह भी बहुत संभावना है कि अगर आपके फ्रैगमेंट की सूची लेआउट बहुत सरल है, तो आपको NestedScrollView का उपयोग करने की भी आवश्यकता नहीं होगी।

उदाहरण लेआउट

गतिविधि का लेआउट:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:fitsSystemWindows="true"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="@dimen/app_bar_height"
                android:scaleType="centerCrop"
                android:src="@drawable/my_bg"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.8"
                app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

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

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.design.widget.TabLayout
            android:id="@+id/content_tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    </LinearLayout>

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

यदि आपको TabLayout की आवश्यकता नहीं है, तो आप LinearLayout को खोद सकते हैं और ViewPager को स्टैंडअलोन बना सकते हैं। लेकिन app:layout_behavior="@string/appbar_scrolling_view_behavior"ViewPager विशेषताओं में उपयोग करना सुनिश्चित करें ।

सरल टुकड़ा लेआउट:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

कॉम्प्लेक्स फ्रैगमेंट का लेआउट:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillViewport="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Hello World"/>
    </RelativeLayout>
</android.support.v4.widget.NestedScrollView>

उदाहरण ऐप: CollapsingToolbarPoc

यहां छवि विवरण दर्ज करें


यह वही है जिसने मेरे लिए किया। धन्यवाद!
आरजेआर-एप्स

हे इनो, यह काम करने लगता है लेकिन जब मैं TabLayout के शीर्ष पर एक और दृश्य जोड़ता हूं, तो इसका टूटना। क्या आप कुछ सहायता दे सकते हैं?
hushed_voice

आपने मेरे दिनों को बचाया है। :)
androidXP

20

वही मुद्दे थे।

जब ViewPager के आसपास NestedScrollView डालते हैं , तो यह काम नहीं करेगा।

हालाँकि DID काम करता है, लेकिन NestedScrollView को उस टुकड़े के लेआउट के अंदर डाल रहा हूँ जो मैं ViewPager के अंदर लोड कर रहा हूँ।

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@id/fragment_detail"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="fill_vertical"
            android:orientation="vertical">
    ...Content...
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>


क्या यह काम करता है यदि सामग्री एक अन्य NestedScrollView के साथ समन्वयक लेआउट थी? और क्या पेरेंट कोऑर्डिनेटर लयआउट स्क्रॉल घटनाओं को सुनता है?
एतेह

यह काम मेरे लिए। मैं ViewPager के बजाय अपने ViewPager के प्रत्येक आइटम में NestedScrollView जोड़ता हूं। धन्यवाद।
१५:१६ १२:०६ पर जोगरेंन

मेरे पास टुकड़े में swipefreshlayout है, उर समाधान के अनुसार, मैंने NiedScrollview को टुकड़ा में, ऊपर swipeRefreshLayout के ऊपर रखा .. तो डेटा लोड नहीं हो रहा है। यह काम नहीं किया।
पलक दारजी

16

आप इस तरह की कोशिश कर सकते हैं, देखने वाला ठीक काम करता है, लेकिन देखने वाले की ऊंचाई तय है।

मैं अभी भी बेहतर समाधान पा रहा हूं ..., तो कृपया मुझे बताएं कि कोई भी बिंदु इसे बेहतर कर सकता है, धन्यवाद

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="800dp"
        android:orientation="vertical">

        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

क्या आपने इसे "android.support.design.widget.CoordinatorLayout" और एक टकराने वाले टूलबार में एनकैप्सुलेट करने की कोशिश की थी?
Kyso84

आपको लगता है कि समस्या ऊँचाई में है। अभी तक कोई सुधार नहीं मिला है @Paul?
jasxir

3
इसने मेरे लिए काम किया, लेकिन मुझे नेस्टव्यू पर setFillViewport (सच) भी कॉल करना पड़ा।
लैरीटेक

12

मेरे पास एक ही मुद्दा था, और बस इसे कुछ बदलावों के साथ तय किया। ViewPagerके भीतर काम नहीं करता हैNestedScrollView । सीधे शब्दों में कहें तो आप का ViewPagerसीधा बच्चा है CoordinatorLayout। फिर प्रत्येक ViewPager के टुकड़े के लिए सामग्री को संलग्न किया जाना चाहिए NestedScrollViewबस।


भले ही सामग्री एक अन्य NestedScrollView के साथ समन्वयक लेआउट थी?
अतिहि

1
खंड सूची डेटा इस तरह लोड नहीं किया जा रहा है!
पलक दारजी

5

आपको लंबन प्रभाव के लिए नस्टेडस्क्रोल व्यू का उपयोग करने की आवश्यकता नहीं है। कुछ इस तरह का प्रयास करें:

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true">

        <android.support.v7.widget.Toolbar
            android:id="@+id/my_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|enterAlways"/>

        <android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/my_tab_layout"
            android:fillViewport="false"
            app:tabMode="fixed"/>
     </android.support.design.widget.AppBarLayout>

            <android.support.v4.view.ViewPager
                android:id="@+id/my_view_pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

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

3
यह तब तक काम करेगा, जब तक आपके सभी ViewPagerटुकड़े ईथर हैं RecyclerView, या NestedScrollView। यदि वे (जैसे ListView) नहीं हैं , तो लॉलीपॉप और इसके बाद के संस्करण के लिए एक समाधान कॉल करना हैlistView.setNestedScrollingEnabled(true)
AndyDeveloper

अंत में एक अतिरिक्त स्क्रॉलिंग कंटेनर को जोड़ने के बिना काम करता है कि कुछ! Btw आप इस सेट को सेट कर सकते हैं। नेक्स्टस्क्रोलिंग सक्षम (x) में भी सही: android: nestedScrollingEnabled = "true"
Analizer

1
अगर मैं अपना ऐप चलाता हूं, तो टूलबार को एक टैब में स्विच करें, टैब को स्विच करें, फिर टूलबार को वापस नीचे खींचें, यह खाली है। इसे फिर से वापस लाने के लिए गैर-ढहने की स्थिति में टैब को स्विच करना होगा। इतना करीब, अभी तक :(
me--

4

मेरे पास इसके नीचे NestedSrollView के साथ एक ऐप टूलबार के साथ एक लेआउट था, फिर नेस्टेड टूलबार के अंदर एक LinearLayout था, LinearLayout के नीचे एक व्यू पेजर था। आइडिया था NearScrollView के अंदर LinearLayout तय किया गया था - आप दृश्य पेजर के विचारों के बीच बाएं / दाएं स्लाइड कर सकते हैं, लेकिन यह सामग्री क्षैतिज रूप से नहीं चलेगी कम से कम से । नेस्टेड स्क्रॉल दृश्य के कारण आपको सभी सामग्री को लंबवत स्क्रॉल करने में सक्षम होना चाहिए। यही विचार था। इसलिए मैंने NestedScrollView की ऊँचाई को मैच_परेंट में सेट किया, व्यूपोर्ट भरा, फिर सभी बच्चों को wra_content के लिए लेआउट / ViewPager दिया।

मेरे सिर में जो सही था। लेकिन यह काम नहीं किया - ViewPager ने मुझे बाएं / दाएं जाने की अनुमति दी, लेकिन कोई ऊर्ध्वाधर स्क्रॉलिंग नहीं है, चाहे व्यू पेज पेज की सामग्री वर्तमान स्क्रीन के नीचे धकेल दी गई हो या नहीं। यह मूल रूप से बदल जाता है क्योंकि ViewPager अपने विभिन्न पृष्ठों पर wra_content का सम्मान नहीं करता है।

मैंने इसे वर्तमान चयनित आइटम के आधार पर ऊँचाई में परिवर्तन करने के लिए ViewPager को उप-क्रमबद्ध करके इसे गोल किया, लेआउट_हाइट = "wra_content" की तरह व्यवहार करने के लिए मजबूर किया:

public class ContentWrappingViewPager extends ViewPager {

    public ContentWrappingViewPager(Context context) {
        super(context);
    }

    public ContentWrappingViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int height = 0;
        if (getChildCount() > getCurrentItem()) {
            View child = getChildAt(getCurrentItem());
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if(h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

समाधान इस उत्तर से प्रेरित था । मेरे लिए काम किया!


लेकिन स्क्रॉल दृश्य स्वचालित रूप से शीर्ष पर स्क्रॉल करता है? इसे कैसे ठीक करें?
विवेक कुमार

4

इस लाइन को NestedScrollView में डालें

android:fillViewport="true"

टोंस ऑफ थैंक्स। यदि मैं सीधे CollapsingToolbarLayout को छूकर स्क्रॉल करना चाहता हूं तो मुझे क्या करना चाहिए?
प्रतिक सलूजा

3

मैंने NestedScrollView को मुख्य लेआउट से हटा दिया और मेरे सभी Fragment लेआउट में एक अभिभावक के रूप में डाला गया जिसे ViewPager में लोड करना चाहिए था, मेरे लिए इस मुद्दे को निर्धारित किया।


3

अपनी समस्या को हल करने के लिए अनुकूलित वर्ग के नीचे का उपयोग करें। Pagechangelistener पर onRefresh () विधि को कॉल करना न भूलें।

public class ContentWrappingViewPager extends ViewPager
{
    private int width = 0;
    public ContentWrappingViewPager(Context context) {
        super(context);
    }

    public ContentWrappingViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        int height = 0;
        width = widthMeasureSpec;
        if (getChildCount() > getCurrentItem()) {
            View child = getChildAt(getCurrentItem());
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if(h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void onRefresh()
    {
        try {
            int height = 0;
            if (getChildCount() > getCurrentItem()) {
                View child = getChildAt(getCurrentItem());
                child.measure(width, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                int h = child.getMeasuredHeight();
                if(h > height) height = h;
            }

            int heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
            ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
            layoutParams.height = heightMeasureSpec;
            this.setLayoutParams(layoutParams);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2

मुझे एक समान समस्या हो रही थी (लेकिन बिना CollapsingToolbarLayout, बस एक सरल Toolbar+ TabLayoutभीतर AppBarLayout)। मैं टूलबार को दृष्टि से बाहर स्क्रॉल करना चाहता था जब ViewPagerभीतर की सामग्री को स्क्रॉल करना NestedScrollView

मेरा लेआउट कुछ इस तरह से चला गया:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_tab_layout"
                android:fillViewport="false"
                app:tabMode="fixed"/>
         </android.support.design.widget.AppBarLayout>

         <android.support.v4.widget.NestedScrollView
                android:id="@+id/container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fillViewport="true"
                android:layout_gravity="fill_vertical"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">

                <android.support.v4.view.ViewPager
                    android:id="@+id/my_view_pager"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                     app:layout_behavior="@string/appbar_scrolling_view_behavior">
                </android.support.v4.view.ViewPager>
         </android.support.v4.widget.NestedScrollView>

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

यह लेआउट उद्देश्य के अनुसार काम नहीं कर रहा था, लेकिन मैंने इसे केवल छुटकारा पाने NestedScrollViewऔर LinearLayoutइसके बजाय उपयोग करके हल किया । इसने मेरे लिए एंड्रॉइड सपोर्ट लाइब्रेरी v23.1.0 पर तुरंत काम किया। यहां बताया गया है कि लेआउट कैसे समाप्त हुआ:

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:animateLayoutChanges="true">

            <android.support.v7.widget.Toolbar
                android:id="@+id/my_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways"/>

            <android.support.design.widget.TabLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_tab_layout"
                android:fillViewport="false"
                app:tabMode="fixed"/>
         </android.support.design.widget.AppBarLayout>

         <LinearLayout
            android:orientation="vertical"
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="4dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

                <android.support.v4.view.ViewPager
                    android:id="@+id/my_view_pager"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                     app:layout_behavior="@string/appbar_scrolling_view_behavior">
                </android.support.v4.view.ViewPager>
         </LinearLayout>

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

पुनश्च: ये वास्तव में मेरी परियोजना में दो लेआउट फाइलें थीं। मैंने उन्हें यहां कॉपी और पेस्ट किया और उन्हें संरचना करने की कोशिश की क्योंकि यह एक ही फाइल में दिखाई देगा। मुझे खेद है कि अगर मैंने कॉपी-पेस्ट करते समय पंगा लिया लेकिन कृपया मुझे बताएं कि अगर ऐसा है तो मैं इसे ठीक कर सकता हूं।


1

निम्नलिखित दृश्य पेजर की उचित ऊंचाई सुनिश्चित करना चाहिए। टुकड़ा दृश्य पेजर द्वारा प्रदान किया गया पहला टुकड़ा है।

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <fragment
            class="com.mydomain.MyViewPagerFragment"
            android:id="@+id/myFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone"/>

    </LinearLayout>

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

1

मेरी एक ही इच्छा है, एक ViewPagerअंदर घोंसला NestedScrollView। लेकिन यह न तो मेरे लिए काम करता है। मेरे मामले में, ViewPagerएक अंदर है Fragmentतो मैं दराज के साथ बातचीत के आधार पर सामग्री को स्विच कर सकता हूं। बेशक, AppBar, पतन, आदि और समर्थन पुस्तकालय की सभी नई सुविधा काम करना चाहिए।

यदि कोई उपयोगकर्ता पेजर में किसी पृष्ठ को लंबवत स्क्रॉल करता है, तो मैं चाहता हूं कि अन्य पेज भी उसी तरह स्क्रॉल किए जाएं, जिससे उपयोगकर्ता को वह समग्र इंप्रेशन दिया जा सके जो पेजर स्वयं स्क्रॉल करता है।

जो मैंने किया, जो काम करता है, वह यह है कि मैं अब ViewPagerअंदर को एम्बेड नहीं करता हूं NestedScrollView, इसके बजाय, मैं अंदर के अंशों की सामग्री को एम्बेड करता हूं NestedScrollView

फिर, एक टुकड़े में एक स्क्रॉल के मामले में, मैं नए स्क्रॉलिंग स्थिति के कंटेनर को सूचित करता हूं, जो इसे स्टोर करता है।

अंत में, पेजर से छोड़ी गई बाईं या दाईं ओर पाई गई ( addOnPageChangeListenerड्रैग स्टेट्स की तलाश में) मैं लक्ष्य को बाएं या दाएं टुकड़े को सूचित करता हूं जहां इसे स्क्रॉल करना होगा (इसके बारे में कंटेनर ज्ञान के आधार पर) मैं उस टुकड़े से गठबंधन करने के लिए आता हूं।


तो अनिवार्य रूप से आपने अपना स्वयं का ViewPager कार्यान्वयन लिखा है? क्या आप इस पर कोड साझा कर पाएंगे?
जॉसफ

मैंने इसके समान कुछ किया (यदि मैं इसे सही तरीके से समझता हूं), जो कि आपके समन्वयक लेआउट में एक रेखीय लेआउट करना है, जिसमें नेस्टेड स्क्रोलव्यू के बजाय टैबलेआउट (यदि आवश्यक हो) और व्यूपेज शामिल हैं। तब टुकड़े स्वयं उनके मूल तत्व के रूप में नेस्टेड स्क्रॉलव्यू होते हैं। यह मेरे लिए काम करता है, लेकिन मैं इसे प्रत्येक खंड में दोहराने के बजाय सिर्फ एक नेस्ट्रोस्क्रूव होना पसंद करूंगा।
क्रिस

0

मुझे पता है कि एक काम करने वाला समाधान: आप कोऑर्डिनेटरलैटआउट के साथ एक्टिविटी का उपयोग करते हैं और फ्रेमलेयआउट, कंटेनर का उपयोग करते हैं। फिर। कंटेनर में टुकड़ा डालने के लिए टुकड़े प्रबंधक का उपयोग करें। उदाहरण के लिए मेरा कोड:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:elevation="0dp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        app:layout_scrollFlags="scroll|enterAlways"
        android:layout_height="@dimen/toolbar_height"
        android:background="?attr/colorPrimary"
        android:gravity="center">

    </android.support.v7.widget.Toolbar>


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

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

</FrameLayout>

और टुकड़ा:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.improvemdia.inmyroom.MainFragment">

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

फिर FragmentManager का उपयोग करें

getSupportFragmentManager().beginTransaction()
            .replace(R.id.container, new MainFragment())
            .commit();

मुझे लगता है LinearLayoutकि फ्रैगमेंट का लेआउट यहां अनावश्यक है। मेरा उत्तर देखें, मैंने अपनी गतिविधि के लेआउट में एक के LinearLayoutबजाय उपयोग किया FrameLayout, और मेरे टुकड़े की जड़ एक ViewPager है (कोई लपेटा हुआ लेआउट नहीं)।
ऐंठन

0

घंटे खर्च करने के बाद ऊपर दिए गए सभी सुझावों की कोशिश की, आखिरकार मैंने इसे काम किया। चाबी NestedScrollViewअंदर डाल रहा है PageViewer, और दोनों के विचारों के लिए सेट layout_behaviorहै । अंतिम लेआउट की तरह है'@string/appbar_scrolling_view_behavior'

<CoordinatorLayout>
    <ViewPager app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <NestedScrollView fillViewport="true" app:layout_behavior="@string/appbar_scrolling_view_behavior">
            <Content>...</Content>
        </NestedScrollView>
    </ViewPager>
    <AppBarLayout>...</AppBarLayout>
</CoordinatorLayout>


0

वास्तव में NestedScrollView कोऑर्डिनेटरलैटआउट में CollapsingToolbarLayout के प्रत्यक्ष भाई होने की आवश्यकता नहीं है। मैंने बहुत कुछ हासिल किया है। Appbar_scrolling_view_behavior 2 नेस्टेड टुकड़ों में काम करता है।

मेरी गतिविधि लेआउट:

<android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.AppBarLayout>

            <android.support.design.widget.CollapsingToolbarLayout>

                <include
                    layout="@layout/toolbar"/>

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

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

    <FrameLayout
        android:id="@+id/container"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

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

"कंटेनर" फ्रेमलैटआउट में मैंने इस टुकड़े को फुलाया है:

<android.support.constraint.ConstraintLayout>

    ... some content ...

    <android.support.v4.view.ViewPager/>

    ...

</android.support.constraint.ConstraintLayout>

और अंदर टुकड़े टुकड़े कि ViewPager इस तरह दिखता है:

<RelativeLayout>

    <android.support.v7.widget.RecyclerView/>

    ....

</RelativeLayout>

तथ्य यह है कि NestedScrollView CoordinatorLayout के बच्चों में इतना गहरा हो सकता है कि पदानुक्रम और स्क्रॉल व्यवहार स्टिल कार्यों ने मुझे आश्चर्यचकित कर दिया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.