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 अडैप्टर क्लास को बदलने के लिए,
आपको ये बदलाव करने होंगे:
- व्यू के हिसाब से पेज दिखाने के लिए, सुपर क्लास को
RecyclerView.Adapterमें बदलें या फ़्रैगमेंट के बारे में पता लगाने के लिएFragmentStateAdapter. - फ़्रैगमेंट-आधारित अडैप्टर क्लास में कंस्ट्रक्टर पैरामीटर बदलें.
getCount()के बजायgetItemCount()को ओवरराइड करें.- फ़्रैगमेंट-आधारित अडैप्टर में
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 के बारे में ज़्यादा जानने के लिए, नीचे दिए गए अतिरिक्त संसाधन देखें.
सैंपल
- GitHub पर ViewPager2 के सैंपल
वीडियो
- पेज को बदलना: ViewPager2 पर माइग्रेट करना (Android Dev समिट '19)