2011-07-19 13 views
61

वर्तमान में मेरे पास ओवरले में एक टुकड़ा है। यह सेवा में साइन इन करने के लिए है। फोन ऐप में, ओवरले में जो भी कदम दिखाना चाहते हैं, वे अपनी स्क्रीन और गतिविधियां हैं। साइन-इन प्रक्रिया के 3 भाग हैं और प्रत्येक की अपनी गतिविधि थी जिसे startActivityForResult() के साथ बुलाया गया था।क्या कोई ऐसी विधि है जो परिणाम के लिए प्रारंभ खंड की तरह काम करती है?

अब मैं टुकड़े और ओवरले का उपयोग करके वही काम करना चाहता हूं। ओवरले प्रत्येक गतिविधि के अनुरूप एक टुकड़ा दिखाएगा। समस्या यह है कि इन टुकड़ों को हनीकॉम एपीआई में एक गतिविधि में होस्ट किया जाता है। मैं पहला टुकड़ा काम कर सकता हूं, लेकिन फिर मुझे एक्टिविटीफॉर रिसेट() शुरू करना होगा, जो संभव नहीं है। क्या StartFragmentForResult() के साथ कुछ है जहां मैं एक नया टुकड़ा निकाल सकता हूं और जब यह हो जाता है तो क्या यह पिछले खंड में परिणाम देता है?

उत्तर

40

सभी टुकड़े गतिविधियां के अंदर रहते हैं। नतीजे के लिए एक टुकड़ा शुरू करना ज्यादा समझ में नहीं आता है, क्योंकि जिस गतिविधि में यह रहता है, उसके पास हमेशा इसका उपयोग होता है, और इसके विपरीत। यदि टुकड़े को परिणामस्वरूप पारित करने की आवश्यकता है, तो यह इसकी गतिविधि तक पहुंच सकता है और इसके परिणाम को सेट कर सकता है और इसे समाप्त कर सकता है। एक ही गतिविधि में टुकड़ों को स्वैप करने के मामले में, गतिविधि अभी भी दोनों टुकड़ों द्वारा सुलभ है, और आपके सभी संदेश पास होकर गतिविधि के माध्यम से जा सकते हैं।

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

+8

अतिरिक्त रूप से जब एक से दूसरे टुकड़े को लोड करते हैं तो आप लक्ष्य खंड सेट कर सकते हैं और यदि आप चाहें तो पैरेंट खंड की 'onActivityResult' विधि पर वापस कॉल कर सकते हैं। – PJL

+2

आपका उत्तर अधूरा है, टुकड़े गतिविधियों जैसे जीवन चक्र का उपयोग कर रहे हैं। इसलिए, हम विधियों के माध्यम से तर्क पारित नहीं कर सकते हैं, लेकिन हमें मूल्यों को पारित करने के लिए बंडलों का उपयोग करना चाहिए। यहां तक ​​कि अगर टुकड़ा कहीं एक मूल्य निर्धारित करता है, तो हमें यह जानना होगा कि वह कब समाप्त हुआ। क्या पिछले टुकड़ों को मूल्य शुरू होता है जब यह शुरू होता है/फिर से शुरू होता है? यह एक विचार है। लेकिन मूल्य को स्टोर करने का कोई उचित तरीका नहीं है, खंड को कई अन्य टुकड़ों/गतिविधियों द्वारा बुलाया जा सकता है। – Loenix

45

अगर आप चाहें, वहाँ टुकड़े के बीच संचार के लिए कुछ तरीकों,

setTargetFragment(Fragment fragment, int requestCode) 
getTargetFragment() 
getTargetRequestCode() 

आप इन का उपयोग कर कॉलबैक कर सकते हैं।

Fragment invoker = getTargetFragment(); 
if(invoker != null) { 
    invoker.callPublicMethod(); 
} 
+5

क्या यह तब भी काम करता है जब एक टुकड़ा बदल दिया जाता है? – Ronnie

+0

मैंने इसकी पुष्टि नहीं की है, लेकिन शायद यह काम करता है। इसलिए, आपको 'setTargetFragment() 'के दुरुपयोग द्वारा सर्कुलर संदर्भ के कारण मेमोरी लीक की देखभाल करनी चाहिए। – nagoya0

+2

अब तक का सबसे अच्छा समाधान!एक गतिविधि और टुकड़ों का एक ढेर होने पर महान काम करता है जहां सही टुकड़े को सूचित करने का प्रयास करना एक दुःस्वप्न होगा। धन्यवाद –

3

मेरा 2 सेंट।

मैं छुपा और शो/जोड़ (मौजूदा/नया) का उपयोग करके एक नए टुकड़े को एक पुराने टुकड़े को स्वैप करके बीच के टुकड़े स्विच करता हूं। तो यह जवाब उन देवताओं के लिए है जो मेरे जैसे टुकड़ों का उपयोग करते हैं।

फिर मैं onHiddenChanged विधि का उपयोग यह जानने के लिए करता हूं कि पुराने टुकड़े को नए से वापस स्विच किया गया है। नीचे कोड देखें।

नया टुकड़ा छोड़ने से पहले, मैंने पुराने खंड में पूछे जाने वाले वैश्विक पैरामीटर में एक परिणाम निर्धारित किया। यह एक बहुत ही बेवकूफ समाधान है।

@Override 
public void onHiddenChanged(boolean hidden) { 
    super.onHiddenChanged(hidden); 
    if (hidden) return; 
    Result result = Result.getAndReset(); 
    if (result == Result.Refresh) { 
     refresh(); 
    } 
} 

public enum Result { 
    Refresh; 

    private static Result RESULT; 

    public static void set(Result result) { 
     if (RESULT == Refresh) { 
      // Refresh already requested - no point in setting anything else; 
      return; 
     } 
     RESULT = result; 
    } 

    public static Result getAndReset() { 
     Result result = RESULT; 
     RESULT = null; 
     return result; 
    } 
} 
+0

के लिए WeakReference का उपयोग करते हैं तो बेहतर होता है 'getAndReset() 'विधि क्या है? – EpicPandaForce

+0

समझने के लिए गायब कोड (इसका हिस्सा) जोड़ा गया। –

1

अपने टुकड़े में आप getActivity() को कॉल कर सकते हैं। यह आपको उस गतिविधि तक पहुंच प्रदान करेगा जिसने खंड बनाया है। वहां से आप मान सेट करने या मानों को पार करने के लिए अपनी कस्टमाइज़ विधि को कॉल कर सकते हैं।

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