2012-11-01 24 views
8

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

बैकस्टैक में लेनदेन जोड़ना मदद नहीं करता है।

धन्यवाद

उत्तर

20

आप Activity में onKeyDown() विधि ओवरराइड करने के लिए किया है।

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     myViewPager.setCurrentItem(0, true); 
     return true; 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 

यह "बैक" बटन प्रेस इवेंट कैप्चर करेगा और उपयोगकर्ता को ViewPager में पहले आइटम पर भेज देगा।

ViewPager#getCurrentItem() भी है जिसका उपयोग उपयोगकर्ता द्वारा स्वाइप किए जाने पर ही वापस जाने के लिए किया जा सकता है। इस तरह के एक कार्यान्वयन:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK && myViewPager.getCurrentItem() == 1) { 
     myViewPager.setCurrentItem(0, true); 
     return true; 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 
} 

उपयोगकर्ता को पिछले पृष्ठ पर वापस भेज दिया जाएगा यदि उपयोगकर्ता अगले पृष्ठ पर था। अन्यथा, यह सामान्य रूप से "बैक" पंजीकृत करेगा और उपयोगकर्ता उम्मीद के अनुसार बाहर निकल जाएगा।

आप उस मामले को चाहते हैं जिसमें उपयोगकर्ता पिछले पृष्ठ पर वापस जाता है (मान लें कि आपके पास दो से अधिक पृष्ठ हैं)। इस मामले में, आप ViewPager.OnPageChangeListener() को कार्यान्वित करना चाहते हैं और onPageSelected(int position) को हर बार स्थिति को सहेजना चाहते हैं। यदि आप उन्हें एक स्टैक में लागू करते हैं, तो जब भी उपयोगकर्ता "बैक" दबाता है तो आप उन्हें पॉप कर सकते हैं। एक बार ढेर खाली हो जाने के बाद, ऐप से बाहर निकलें।

संपादित

के रूप में सही ढंग से जेड Byfield, यह करने के लिए गतिविधि में onBackPressed() उपयोग करने के लिए किया जाएगा एक से थोड़ा आसान तरीका द्वारा टिप्पणी में कहा गया है। यह केवल एपीआई स्तर 5+ में काम करेगा।

@Override 
public void onBackPressed() { 
    if(i_dont_want_to_leave) { 
    myViewPager.setCurrentItem(0, true); 
    } else { 
    super.onBackPressed(); // This will pop the Activity from the stack. 
    } 
} 
+0

क्या वह बैकप्रेस पर भी ओवरराइड कर सकता था? या यह केवल पूर्व एपीआई के लिए है? –

+0

पर आधारित KeyDown() प्रत्येक प्लेटफ़ॉर्म API स्तर 1+ पर काम करता है। इसके अलावा, जब तक कि मैं इसे सभी गलत तरीके से उपयोग नहीं कर रहा हूं, पर बैकप्रेस किए गए गतिविधि को स्टैक से पॉप किए जाने से नहीं रोकेगा। यदि आप 'केडडाउन()' पर 'सत्य' वापस करते हैं, तो यह एकमात्र चीज होगी जो घटित होती है और घटना कैस्केडिंग बंद कर देगी। – DeeV

+0

रुको। बस एक मस्तिष्क डंप था। हां। यदि वह एपीआई 5+ को लक्षित करना चाहता है तो वह बैकप्रेसेड() पर उपयोग कर सकता है। बस 'super.onBackPressed()' को कॉल न करें जबतक कि आप पूरी तरह से सुनिश्चित नहीं हैं कि आप बाहर निकलना चाहते हैं। – DeeV

0

मुझे लगता है कि एक बेहतर दृष्टिकोण संबंधित टुकड़ों को बैक कुंजी हैंडलिंग का प्रतिनिधित्व करना होगा। मैंने एक कस्टमफ्रेगमेंट का उपयोग किया है जो बैक कुंजी को संभालने के लिए एक विधि का समर्थन करता है। सभी टुकड़े इस कस्टमफ्रैगमेंट से विस्तारित होंगे।

public abstract class BackKeyHandlingFragment extends Fragment { 
    public abstract boolean handleBackKey(); 
} 

गतिविधि वर्तमान फ्रैगमेंट पर बैककी प्रोसेसिंग का प्रतिनिधि दे सकती है। Fragments हैंडलबैककी विधि के अपने संबंधित कार्यान्वयन में आवश्यक कार्रवाई कर सकते हैं। पिछली कुंजी को संसाधित न करने के लिए गतिविधि को बताने के लिए विधि सही हो सकती है। गतिविधि स्तर पर डिफ़ॉल्ट बैक कुंजी कार्रवाई के साथ आगे बढ़ने के लिए, विधि झूठी वापसी कर सकती है।

public void onBackPressed() { 
    BackKeyHandlingFragment fragment = (BackKeyHandlingFragment) mSectionsPagerAdapter.getItem(mViewPager.getCurrentItem()); 
    // Fragment should return boolean according to app requirements after processing back key 
    if (!fragment.handleBackKey()) { 
     super.onBackPressed(); 
    } 
} 
1

एंड्रॉयड डॉक्स पृष्ठ पर

https://developer.android.com/training/animation/screen-slide.html#viewpager

मैं ViewPager निपटने फिसलने का एक उदाहरण मिल गया और एक विधि है

@Override 
public void onBackPressed() { 
    if (mPager.getCurrentItem() == 0) { 
    super.onBackPressed(); 
    } 
    else { 
    mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
    } 
} 

यह पिछले पृष्ठ का चयन करता है या सक्रिय गतिविधि बाहर निकालता है ।