2012-03-14 14 views
5

के लिए एंड्रॉइड परिष्करण पिछले गतिविधियों में मेरे पास 5 गतिविधियां हैं (मान लें A,B,C,D और E)। गतिविधियां ए टू डी कुछ डेटा सेट करने के लिए हैं, इसलिए उपयोगकर्ता जो कुछ भी बदल रहा है उसे आगे और आगे जाने में सक्षम हो सकता है। दूसरी ओर, गतिविधि E सारांश है, इसलिए उपयोगकर्ता को वापस जाने की अनुमति नहीं है।नेविगेशन

मेरा विचार है जब उपयोगकर्ता के लिए हो जाता है E

सभी पिछले गतिविधियों को समाप्त करने के लिए वर्तमान में मेरी AD करने के लिए गतिविधियों कोई भी निशानी उन्हें संलग्न है।

Activty ई इस तरह कहा जाता है:

Intent I = new Intent(this, SomeClass.class);

I.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

startActivity(I);

मैं हर जगह पढ़ा है कि उन झंडे को प्राप्त करने मैं क्या करने की कोशिश कर रहा हूँ की अपेक्षा की जाती है, लेकिन वे नहीं, जब उपयोगकर्ता गतिविधि E पर जाता है और Back बटन दबाता है, तो एप्लिकेशन गतिविधि D पर वापस चला जाता है ।

कोई विचार? मुझे कुछ याद आ रही है? क्या यह इस समस्या को हल करने का सही तरीका नहीं है?

आपकी मदद

उत्तर

7

उपयोग गतिविधियों ए, बी, सी, startActivity के बजाय डी में से प्रत्येक में विधि startActivityForResult। और जब उपयोगकर्ता गतिविधि ई से बाहर निकलता है, तो बैकबटन को संभालें और परिणाम कोड को इरादे में सेट करें। अब प्रत्येक ए, बी, सी और डी कक्षाओं की एक्टिविटी रीसेट विधि में इसे संभाल लें, गतिविधि बंद करें और परिणाम को पिछली गतिविधि में पास करें।

जैसे ही उपयोगकर्ता गतिविधि डी को समाप्त करता है, आप इसे भी कर सकते हैं। जब उपयोगकर्ता डी से ई में जाते हैं, तो आप उपरोक्त विधि का उपयोग वास्तव में गतिविधि ए तक नीचे जाने के लिए कर सकते हैं और फिर गतिविधि ई खोल सकते हैं और गतिविधि ए को समाप्त कर सकते हैं।

उपर्युक्त दोनों मामले उपयोगकर्ता परिप्रेक्ष्य से एक ही परिणाम उत्पन्न करते हैं और वे इंटरमीडिएट गतिविधियों ए, बी, सी, डी नहीं देखते हैं जब तक कि आप उन गतिविधियों के ऑनस्टार्ट विधि में कुछ लंबी नौकरियां नहीं कर रहे हैं।

+0

यह करने में एक आसान बदलाव था और यह काम करता था, बहुत बहुत धन्यवाद! –

0

के लिए धन्यवाद आप activit में onKeyDown() विधि ओवरराइड और KEYCODE_BACK के लिए कुंजी दबाएँ घटना (वापस कुंजी) को बीच में रोकने की जरूरत है, और बस return true इंगित करने के लिए आप वापस घटना संभाला । अब उपयोगकर्ता को पिछली गतिविधि पर नेविगेट करने की अनुमति नहीं दी जाएगी।

+0

ऐसा नहीं करता है। यह वास्तव में एक समस्या पैदा कर रहा है कि उपयोगकर्ताओं को बैक बटन का उपयोग करने का मौका नहीं है जो सर्वोत्तम प्रथाओं के खिलाफ है। बैक बटन को तब तक अवरुद्ध न करें जब तक आपके पास ऐसा करने का कोई अच्छा कारण न हो। और इस मामले में उपयोगकर्ताओं को वापस बटन पर क्लिक करते समय बाहर निकलने से भी रोका जाता है। – achie

0

जब आप गतिविधि ई शुरू करते हैं, इस कोड का उपयोग:

Intent I = new Intent(this, SomeClass.class); 
I.putExtra("finish_all", true); 
I.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(I); 
+0

मैंने कोशिश की लेकिन ऐसा कुछ नहीं लगता है। यह कुछ अंतर्निहित ध्वज या कुछ है? क्या मुझे इसे किसी तरह से इलाज करना है? –

3

मैं your're एक जादूगर :)

किसी प्रकार लिखने के आदेश FLAG_ACTIVITY_CLEAR_TOP झंडा उपयोग करने के लिए आप मौजूदा गतिविधियों के काम में पहले से ही गतिविधि ई होना आवश्यक है में कोशिश कर लगता है।

उदाहरण: ई-> ए-> बी-> सी-> डी -> यदि डी CLEAR_TOP के साथ ई शुरू करेगा, तो आपके पास स्टैक में केवल गतिविधि ई होगी।

FLAG_ACTIVITY_CLEAR_TOP यदि पहले से ही ढेर में मौजूद बुलाया गतिविधि प्रकार का एक उदाहरण है एक गतिविधि लांच करने के लिए झंडा CLEAR_TOP का उपयोग करना है, तो यह उदाहरण के बजाय एक नया उदाहरण बनाने के अग्रभाग में लाया जाता है। साथ ही, उस उदाहरण के शीर्ष पर रहने वाले ढेर में सभी गतिविधियां ढेर से साफ़ हो जाती हैं। उदाहरण के लिए, यह मानते हुए कि वर्तमान गतिविधि स्टैक एबीसीडीई है, टाइप सी की गतिविधि लॉन्च करने से कार्य से डी और ई को स्पष्ट किया जाएगा और परिणामस्वरूप एबीसी स्टैक होगा।

FLAG_ACTIVITY_SINGLE_TOP (अपने परिदृश्य में प्रासंगिक नहीं) लक्ष्य गतिविधि का एक उदाहरण पहले से ही ढेर के शीर्ष पर है, तो कोई नया उदाहरण बन जाता है।

+0

आपकी व्याख्या ने मुझे उन झंडे के वास्तविक उपयोग को समझने में बहुत मदद की। मेरे मामले में ई को कॉल करने से पहले ए व्यवहार्य नहीं था, लेकिन मैं इसे भविष्य के ऐप्स के लिए ध्यान में रखूंगा। बहुत बहुत धन्यवाद! –

5

शायद ज़रुरत पड़े कोई कोड है कि सुझाव दिया @achie की जरूरत है, यहाँ यह है:

ए, बी, सी, डी गतिविधियों इस तरह निम्नलिखित गतिविधि शुरू कर देना चाहिए:

Intent myIntent = new Intent(this, B.class); // Or C/D 
startActivityForResult(myIntent, 1); 

इसके अलावा, एक ए, बी, सी, डी गतिविधियों ओवरराइड करना चाहिए:

:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK && requestCode == 1) { 
     setResult(RESULT_OK); 
     finish(); 
    } 
} 

फिर ई गतिविधि बटन वापस संभाल चाहिए

+0

क्या यह आपके लिए काम करता है? मुझे वही चीज़ चाहिए जो आपको चाहिए, उपर्युक्त कोड की कोशिश की, लेकिन मेरी आखिरी गतिविधि पिछली गतिविधि पर वापस जा रही है। –

+0

हाँ, यह मेरे लिए काम कर रहा है। बी के लिए एक नेविगेट्स, जो सी को नेविगेट करता है, जो डी को नेविगेट करता है, जो ई पर जाता है, फिर आप वापस दबाते हैं और आप होम स्क्रीन पर जाते हैं क्योंकि सभी गतिविधियां समाप्त हो जाती हैं। मैंने आपके लिए एक एंड्रॉइड प्रोजेक्ट नमूना अपलोड किया है: https://anonfiles.com/file/e9a7c889a7b2f358f29c868b7fa1d755 – fernandospr

+0

इसे पोस्ट करने के लिए समय निकालने के लिए धन्यवाद, लेकिन मैं इसे पहले ही काम करने में कामयाब रहा हूं। –

संबंधित मुद्दे