ViewPager से ViewPager2 पर माइग्रेट करें

ViewPager2, ViewPager लाइब्रेरी का बेहतर वर्शन है. इसमें बेहतर सुविधा. साथ ही, ViewPager के इस्तेमाल में आने वाली आम समस्याओं को हल करती है. अगर आपका ऐप्लिकेशन पहले से ही ViewPager का इस्तेमाल कर रहा है, तो इस बारे में ज़्यादा जानने के लिए यह पेज पढ़ें ViewPager2 पर माइग्रेट किया जा रहा है.

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

ViewPager2 पर माइग्रेट करने के फ़ायदे

माइग्रेट करने की मुख्य वजह यह है कि ViewPager2 का इस्तेमाल किया जा रहा है डेवलपमेंट सहायता और ViewPager में सहायता नहीं मिलती है. हालांकि, ViewPager2 की ओर से खास फ़ायदे मिलते हैं.

वर्टिकल ओरिएंटेशन सपोर्ट

ViewPager2 पर ट्रेडिशनल हॉरिज़ॉन्टल पेजिंग के साथ-साथ वर्टिकल पेजिंग भी काम करती है पेजिंग. ViewPager2 एलिमेंट के लिए वर्टिकल पेजिंग चालू करने के लिए, android:orientation एट्रिब्यूट:

<androidx.viewpager2.widget.ViewPager2
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:orientation="vertical" />

आप इस एट्रिब्यूट को प्रोग्राम के हिसाब से भी सेट कर सकते हैं. इसके लिए, setOrientation() तरीका.

दाएं से बाएं समर्थन

ViewPager2 दाएं-से-बाएं (RTL) पेजिंग का समर्थन करता है. RTL पेजिंग चालू है स्थान-भाषा के आधार पर, अपने-आप जहां सही हो, लेकिन मैन्युअल तरीके से ViewPager2 एलिमेंट के लिए, आरटीएल पेजिंग चालू करने के लिए, android:layoutDirection एट्रिब्यूट:

<androidx.viewpager2.widget.ViewPager2
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layoutDirection="rtl" />

आप इस एट्रिब्यूट को प्रोग्राम के हिसाब से भी सेट कर सकते हैं. इसके लिए, setLayoutDirection() तरीका.

संशोधित फ़्रैगमेंट संग्रह

ViewPager2, फ़्रैगमेंट के ऐसे कलेक्शन के ज़रिए पेजिंग करने की सुविधा देता है जिसमें बदलाव किया जा सकता है. कॉल किया जा रहा है notifyDatasetChanged() दिए गए कलेक्शन में कोई बदलाव होने पर, यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के लिए.

इसका मतलब है कि आपका ऐप्लिकेशन और ViewPager2, बदले गए कलेक्शन को सही तरीके से दिखाएगा.

डिफ़टील

ViewPager2 को RecyclerView को बनाया गया है, इसका मतलब है कि इसके पास DiffUtil उपयोगिता क्लास. इससे कई फ़ायदे मिलते हैं, लेकिन सबसे खास बात यह है कि ViewPager2 ऑब्जेक्ट, डेटासेट में बदलाव करने के ऐनिमेशन का स्थानीय तौर पर फ़ायदा ले रहे हैं RecyclerView क्लास से मिला.

अपने ऐप्लिकेशन को ViewPager2 पर माइग्रेट करें

अपने ऐप्लिकेशन में मौजूद ViewPager ऑब्जेक्ट को ViewPager2 में अपडेट करने के लिए, यह तरीका अपनाएं:

एक्सएमएल लेआउट फ़ाइलों को अपडेट करें

सबसे पहले, अपनी एक्सएमएल लेआउट फ़ाइलों में ViewPager एलिमेंट को इससे बदलें ViewPager2 एलिमेंट:

<!-- A ViewPager element -->
<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<!-- A ViewPager2 element -->
<androidx.viewpager2.widget.ViewPager2
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

अडैप्टर क्लास अपडेट करें

ViewPager का इस्तेमाल करते समय, आपको अडैप्टर क्लास को बढ़ाना था ने ऑब्जेक्ट को नए पेज दिए. इस्तेमाल के उदाहरण के आधार पर, ViewPager का इस्तेमाल किया गया तीन अलग-अलग एब्सट्रैक्ट क्लास हैं. ViewPager2 में सिर्फ़ दो ऐब्सट्रैक्ट क्लास का इस्तेमाल किया जाता है.

ViewPager2 ऑब्जेक्ट में बदले जा रहे हर ViewPager ऑब्जेक्ट के लिए, एब्सट्रैक्ट क्लास को अपडेट करके, एब्सट्रैक्ट क्लास को इस तरह से अपडेट करें:

  • जब ViewPager ने पेज थ्रू व्यू पाने के लिए PagerAdapter का इस्तेमाल किया, तो इसका इस्तेमाल करें ViewPager2 के साथ RecyclerView.Adapter.
  • जब ViewPager ने किसी छोटे ट्रैफ़िक से पेज पर जाने के लिए FragmentPagerAdapter का इस्तेमाल किया, फ़्रैगमेंट की तय संख्या के लिए, ViewPager2 के साथ FragmentStateAdapter का इस्तेमाल करें.
  • जब ViewPager ने किसी साइट के पेज पर FragmentStatePagerAdapter का इस्तेमाल किया खंड की बड़ी या अज्ञात संख्या, इसके साथ FragmentStateAdapter का उपयोग करें ViewPager2.

कंस्ट्रक्टर के पैरामीटर

फ़्रैगमेंट पर आधारित अडैप्टर क्लास, जो FragmentPagerAdapter या FragmentStatePagerAdapter हमेशा एक ही FragmentManager ऑब्जेक्ट को स्वीकार करता है कंस्ट्रक्टर पैरामीटर के तौर पर होता है. जब आपFragmentStateAdapter ViewPager2 अडैप्टर क्लास, आपके पास कंस्ट्रक्टर के लिए ये विकल्प हैं पैरामीटर का इस्तेमाल करें:

  • FragmentActivity ऑब्जेक्ट या Fragment ऑब्जेक्ट, जहां ViewPager2 ऑब्जेक्ट मौजूद है. ज़्यादातर मामलों में, यह विकल्प बेहतर होता है.
  • FragmentManager ऑब्जेक्ट और Lifecycle ऑब्जेक्ट.

RecyclerView.Adapter से सीधे तौर पर इनहेरिट की गई, व्यू-आधारित अडैप्टर क्लास ये करती हैं इसके लिए कंस्ट्रक्टर पैरामीटर की ज़रूरत नहीं है.

बदलाव करने के तरीके

आपके अडैप्टर क्लास को भी ViewPager2 के लिए अलग-अलग तरीकों को बदलना होगा ViewPager की तुलना में उन्होंने देखा:

  • getCount() के बजाय, getItemCount() को बदलें. नाम के अलावा, इस तरीके में कोई बदलाव नहीं हुआ है.
  • getItem() के बजाय, फ़्रैगमेंट-आधारित में createFragment() को बदलें अडैप्टर क्लास के बारे में जानकारी देता है. पक्का करें कि createFragment() का नया तरीका हमेशा इस्तेमाल करें जब भी फ़ंक्शन को कॉल किया जाता है, तो हर बार नया फ़्रैगमेंट इंस्टेंस देता है का दोबारा इस्तेमाल करना होगा.

खास जानकारी

खास जानकारी के तौर पर, ViewPager2 के साथ इस्तेमाल करने के लिए ViewPager अडैप्टर क्लास को बदलने के लिए, आपको ये बदलाव करने होंगे:

  1. व्यू के हिसाब से पेज दिखाने के लिए, सुपर क्लास को RecyclerView.Adapter में बदलें या फ़्रैगमेंट के बारे में पता लगाने के लिए FragmentStateAdapter.
  2. फ़्रैगमेंट-आधारित अडैप्टर क्लास में कंस्ट्रक्टर पैरामीटर बदलें.
  3. getCount() के बजाय getItemCount() को ओवरराइड करें.
  4. फ़्रैगमेंट-आधारित अडैप्टर में getItem() के बजाय createFragment() को बदलें क्लास.

Kotlin

// A simple ViewPager adapter class for paging through fragments
class ScreenSlidePagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
    override fun getCount(): Int = NUM_PAGES

    override fun getItem(position: Int): Fragment = ScreenSlidePageFragment()
}

// An equivalent ViewPager2 adapter class
class ScreenSlidePagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
    override fun getItemCount(): Int = NUM_PAGES

    override fun createFragment(position: Int): Fragment = ScreenSlidePageFragment()
}

Java

// A simple ViewPager adapter class for paging through fragments
public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return new ScreenSlidePageFragment();
    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }
}

// An equivalent ViewPager2 adapter class
private class ScreenSlidePagerAdapter extends FragmentStateAdapter {
    public ScreenSlidePagerAdapter(FragmentActivity fa) {
        super(fa);
    }

    @Override
    public Fragment createFragment(int position) {
        return new ScreenSlidePageFragment();
    }

    @Override
    public int getItemCount() {
        return NUM_PAGES;
    }
}

TabLayout इंटरफ़ेस को रीफ़ैक्टर करें

ViewPager2, TabLayout इंटिग्रेशन में बदलाव करता है. अगर आपको फ़िलहाल, हॉरिज़ॉन्टल दिखाने के लिए TabLayout ऑब्जेक्ट के साथ ViewPager का इस्तेमाल किया जा रहा है नेविगेशन के लिए टैब है, तो आपको इसके लिए TabLayout ऑब्जेक्ट का रीफ़ैक्टर करना होगा ViewPager2 के साथ इंटिग्रेशन.

TabLayout को ViewPager2 से अलग कर दिया गया है और अब यह इसके हिस्से के तौर पर उपलब्ध है मटीरियल कॉम्पोनेंट. इसका मतलब है कि इसका इस्तेमाल करने के लिए, आपको आपकी build.gradle फ़ाइल पर सही डिपेंडेंसी:

ग्रूवी

implementation "com.google.android.material:material:1.1.0-beta01"

Kotlin

implementation("com.google.android.material:material:1.1.0-beta01")

आपको के क्रम में TabLayout एलिमेंट की जगह भी बदलनी होगी एक्सएमएल लेआउट फ़ाइल का इस्तेमाल करना होगा. ViewPager के साथ TabLayout एलिमेंट का एलान ViewPager एलिमेंट का चाइल्ड; लेकिन ViewPager2 के साथ, TabLayout एलिमेंट इसे उसी लेवल पर, सीधे ViewPager2 एलिमेंट के ऊपर एलान किया जाता है:

<!-- A ViewPager element with a TabLayout -->
<androidx.viewpager.widget.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</androidx.viewpager.widget.ViewPager>

<!-- A ViewPager2 element with a TabLayout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

आखिर में, आपको वह कोड अपडेट करना होगा जो TabLayout ऑब्जेक्ट को ViewPager ऑब्जेक्ट. जब TabLayout अपने setupWithViewPager() का इस्तेमाल करता है ViewPager के साथ इंटिग्रेट करने का तरीका है, तो इसके लिए एक TabLayoutMediator की ज़रूरत होती है इंस्टेंस ViewPager2 के साथ इंटिग्रेट करना होगा.

TabLayoutMediator ऑब्जेक्ट, पेज के टाइटल जनरेट करने का काम भी मैनेज करता है TabLayout ऑब्जेक्ट के लिए इसका मतलब है कि अडैप्टर क्लास को getPageTitle() को ओवरराइड करें:

Kotlin

// Integrating TabLayout with ViewPager
class CollectionDemoFragment : Fragment() {
    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val tabLayout = view.findViewById(R.id.tab_layout)
        tabLayout.setupWithViewPager(viewPager)
    }
    ...
}

class DemoCollectionPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {

    override fun getCount(): Int  = 4

    override fun getPageTitle(position: Int): CharSequence {
        return "OBJECT ${(position + 1)}"
    }
    ...
}

// Integrating TabLayout with ViewPager2
class CollectionDemoFragment : Fragment() {
    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val tabLayout = view.findViewById(R.id.tab_layout)
        TabLayoutMediator(tabLayout, viewPager) { tab, position ->
            tab.text = "OBJECT ${(position + 1)}"
        }.attach()
    }
    ...
}

Java

// Integrating TabLayout with ViewPager
public class CollectionDemoFragment extends Fragment {
    ...
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        TabLayout tabLayout = view.findViewById(R.id.tab_layout);
        tabLayout.setupWithViewPager(viewPager);
    }
    ...
}

public class DemoCollectionPagerAdapter extends FragmentStatePagerAdapter {
    ...
    @Override
    public int getCount() {
        return 4;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "OBJECT " + (position + 1);
    }
    ...
}

// Integrating TabLayout with ViewPager2
public class CollectionDemoFragment : Fragment() {
    ...
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        TabLayout tabLayout = view.findViewById(R.id.tab_layout);
        new TabLayoutMediator(tabLayout, viewPager,
                (tab, position) -> tab.setText("OBJECT " + (position + 1))
        ).attach();
    }
    ...
}

स्क्रोल किए जा सकने वाले नेस्ट किए गए एलिमेंट के साथ काम करें

ViewPager2, नेस्ट किए गए स्क्रोल व्यू के साथ नेटिव तौर पर काम नहीं करता. ऐसा उन मामलों में होता है जहां स्क्रोल व्यू का ओरिएंटेशन वही है जो ViewPager2 ऑब्जेक्ट का है, जिसमें इसे. उदाहरण के लिए, वर्टिकल स्क्रोल व्यू के लिए, स्क्रोलिंग काम नहीं करेगी वर्टिकल-ओरिएंटेड ViewPager2 ऑब्जेक्ट.

एक जैसे ओरिएंटेशन वाले ViewPager2 ऑब्जेक्ट में, स्क्रोल व्यू को चलाने के लिए, तुम्हें कॉल करना होगा ViewPager2 ऑब्जेक्ट पर requestDisallowInterceptTouchEvent() जब आप इसके बजाय नेस्ट किए गए एलिमेंट को स्क्रोल करना चाहिए. ViewPager2 में नेस्ट की गई स्क्रोलिंग सैंपल में बताया गया है कि इस सवाल को किस तरह हल किया जा सकता है. इसके लिए, ये अलग-अलग तरह के विकल्प उपलब्ध कराते हैं कस्टम रैपर लेआउट.

अन्य संसाधन

ViewPager2 के बारे में ज़्यादा जानने के लिए, नीचे दिए गए अतिरिक्त संसाधन देखें.

सैंपल

वीडियो