मैं अब आपको इसका हैक बता रहा हूं, इसलिए उस कारण को कम करने का कोई कारण नहीं है। मतलब, यह या तो आपके लिए विशेष रूप से उपयोगी होगा या नहीं। किसी भी तरह से, नीचे दिया गया विवरण कुछ अंतर्दृष्टि प्रदान करेगा और समुदाय के लिए सहायक होगा। इसके अलावा, यह समाधान पुराने APIs के लिए अच्छा है जो नहीं है ViewPager.getCurrentItem()।
पहले, थोड़ी जानकारी। यदि आप एक ViewPager के सभी बच्चों के साथ पुनरावृति करते हैं ViewPager.getChildAt(x);और प्रत्येक बच्चे के साथ toString()(या getLeft()) प्रिंट करते हैं (या एक पृष्ठ देखें) और फिर हर बार जब आप पृष्ठ बदलते हैं, तो आप देखेंगे कि बच्चे उस तार्किक क्रम में नहीं होंगे जो वे प्रदर्शित होते हैं जब आप पृष्ठ वापस जाने लगते हैं (शुरुआत में वापस पेजिंग)। जाहिरा तौर पर, यह अनावश्यक बच्चे को सरणी से हटा देगा और फिर नए बच्चे को सरणी में जोड़ देगा। इसलिए, उदाहरण के लिए, हम कहते हैं कि आप पृष्ठ 2 को देख रहे हैं, फिर पृष्ठ 3 में बदल गया है, आपके बच्चों की सूची इस क्रम में होगी page 2, page 3, page 4जिसका अर्थ है कि ViewPager.getChildAt(1);वर्तमान पृष्ठ वापस आ जाएगा। लेकिन, यदि आप फिर से पेज 2 पर वापस आते हैं (पेज 3 से) तो आपके बच्चों की सूची इस क्रम में होगी page 2, page 3, page 1जिसका अर्थ हैViewPager.getChildAt(1);वर्तमान पृष्ठ वापस नहीं करता है। मैं अभी तक इस जानकारी का उपयोग करके वर्तमान पृष्ठ को निकालने के लिए सरल तर्क खोजने में सक्षम नहीं हूं। क्योंकि getChildAtउपयोगकर्ता के आसपास पेजिंग कैसे की गई है, इस आधार पर सरणी में पृष्ठों का क्रम एक अनियंत्रित क्रम में है।
कहा जा रहा है, मैंने एक हैक काम विकसित किया है। मुझे कोई सुराग नहीं है अगर यह फ़ंक्शन सभी वातावरण में काम करेगा, लेकिन यह मेरी वर्तमान परियोजना के लिए काम करता है। मुझे संदेह है कि अगर आपके लिए नहीं है, तो इसका अलग एपीआई स्तर का मुद्दा है। लेकिन मुझे वास्तव में अन्य वातावरणों के लिए किसी भी मुद्दे पर संदेह नहीं है।
अब, मांस पर। मैंने देखा कि ViewPager.getChildAt(x).getLeft()माता-पिता के सापेक्ष क्षैतिज पिक्सेल का किसी प्रकार का परिणाम होगा। इसलिए, मैंने इस जानकारी का उपयोग खरपतवार के लिए किया है जो वर्तमान में है।
private int getCurrentPageIndex(ViewPager vp){
int first,second,id1,id2,left;
id1 = first = second = 99999999;
View v;
for ( int i = 0, k = vp.getChildCount() ; i < k ; ++i ) {
left = vp.getChildAt(i).getLeft();
if ( left < second ) {
if ( left < first ) {
second = first;
id2 = id1;
first = left;
id1 = i;
} else {
second = left;
id2 = i;
}
}
}
return id2;
}
यह फ़ंक्शन संभवतः एक संदिग्ध हैक है क्योंकि getLeft()यह सभी को जानने के लिए मूल्य पर निर्भर करता है। लेकिन, मैं प्रत्येक बच्चे के बाएं समन्वय को पकड़ता हूं। मैं इसके बाद अन्य मूल्यों से तुलना करता हूं और पहले और दूसरे पेज को स्टोर करता हूं, दूसरे पेज (वर्तमान पेज) को फंक्शन से बाहर लौटाता हूं। यह खूबसूरती से काम करने लगता है।
क्यों (आप पूछ सकते हैं) मैंने सिर्फ onClickListenterया जो भी समाधान का उपयोग नहीं किया ? ठीक है, मुझे यह निर्धारित किया गया था कि श्रोताओं, अन्य वर्गों, अनिर्णायक फोकस और अन्य ब्लोट को शामिल किए बिना ऐसा करने के लिए एक सीधा आगे रास्ता था। दुर्भाग्य से, यह समाधान बिल्कुल सीधे आगे नहीं है। लेकिन, यह ब्लोट, अन्य वर्गों और श्रोताओं के साथ दूर करता है। अगर मैं अधिक सीधे आगे के रास्ते का पता लगा सकता हूं, तो मैं इस फ़ंक्शन को फिर से लिखूंगा। या हो सकता है, यह किसी और के लिए एक एपिफनी होने के लिए अंतर्दृष्टि प्रदान करेगा।