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()
को बदलें क्लास.
// 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()
}
// 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"
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()
को ओवरराइड करें:
// 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()
}
...
}
// 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)