2012-03-19 9 views
14

मैं अपने कुछ प्रोजेक्ट को टुकड़ों का उपयोग करने के लिए परिवर्तित कर रहा हूं। हम एक खंड संवाद के साथ कैसे संवाद करते हैं? मैं उपयोगकर्ता से कुछ पाठ इनपुट प्राप्त करने के लिए बस एक खंड संवाद बनाना चाहता हूं। जब संवाद को खारिज कर दिया जाता है, तो मैं दर्ज टेक्स्ट को "पैरेंट" खंड में वापस लेना चाहता हूं (जिसने इसे शुरू किया)। उदाहरण:एक खंड संवाद से डेटा वापस प्राप्त करें - सर्वोत्तम प्रथाओं?

public class MyFragment extends Fragment { 

    public void onBtnClick() { 
     // What's a good way to get data back from this dialog 
     // once it's dismissed? 
     DialogFragment dlgFrag = MyFragmentDialog.newInstance(); 
     dlgFrag.show(getFragmentManager(), "dialog"); 
    } 
} 

धन्यवाद

उत्तर

14

एक शानदार तरीका पारित करने के लिए घटनाक्रम इस तरह का एक कॉलबैक इंटरफ़ेस

public class MyFragment extends Fragment { 
    ... 
    // Container Activity must implement this interface 
    public interface OnArticleSelectedListener { 
     public void onArticleSelected(Uri articleUri); 
    } 
    ... 
} 
तरह Android डेवलपर गाइड

आपका टुकड़ा एक कॉलबैक इंटरफ़ेस में परिभाषित descripted की तरह है

फिर यदि आप कॉलबैक इंटरफेस को लागू करते हैं और इंस्टेंस को सहेजते हैं तो आप अपने अटैच विधि के अंदर जांचते हैं।

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mListener = (OnArticleSelectedListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener"); 
    } 
} 

जब टुकड़ा अंदर अपने इवेंट आप बस कॉलबैक हैंडलर

mListener.onArticleSelected(...); 

आशा है कि मदद करता है, आगे infos here

+21

यह ओपी के प्रश्न का उत्तर नहीं देता है। वह वापस 'माईफ्रैगमेंट' खंड में संवाद करना चाहते हैं और इससे उन्हें 'मायफ्रैगमेंट' शुरू करने वाली गतिविधि पर संवाद करने की अनुमति मिल जाएगी। – eternalmatt

+3

यह एक गतिविधि और एक टुकड़े के बीच संवाद करने के लिए है। टुकड़ों के बीच संवाद करने के लिए, 'setTargetFragment() 'और' getTargetFragment() 'का उपयोग करें। –

+2

मैं इस उत्तर में जोड़ना चाहता हूं: __ डी कंसस्ट्रक्टर के माध्यम से कुछ भी पास नहीं कर रहा है यह आवश्यक है कि कन्स्ट्रक्टर को कोई तर्क (सी ++ शर्तों में डिफ़ॉल्ट रूप से निर्मित) के साथ बुलाया जा सके, 'एटैच' का उपयोग करें, क्योंकि यह उत्तर –

30

रूप eternalmatt कहा दिया समाधान वास्तव में इस सवाल का जवाब नहीं है फोन होता है । टुकड़ा के साथ संवाद संवाद करने के लिए जिस तरह से बुला रहा है:

dialog.setTargetFragment(myCallingFragment, requestCode); 

तरह से मैं क्या यह एक स्थिर तरीका है, जहां श्रोता instanciated है एक तो setFragmentTarget() चीजें करते साथ FragmentDialog बनाने के द्वारा है:

public mySuperFragmentDialog extends DialogFragment { 
    public interface SuperListener{ 
    void onSomethingHappened(); 
    } 

    public static mySuperFragmentDialog newInstance(SuperListener listener){ 
    MySuperFagmentDialog f = new MySuperFragmentDialog(); 
    f.setTargetFragment((Fragment) listener, /*requestCode*/ 1234); 
    return f; 
    } 
} 
तब

Dialog dialog = MySuperFragmentDialog.newInstance(parentFragment); 
dialog.show(); 

जब आप टुकड़ा जो संवाद सिर्फ कॉल के साथ comunicate करना चाहते हैं:

टुकड़ा से संवाद बनाने के लिए बस हमेशा की तरह करते हैं

Fragment parentFragment = getTargetFragment(); 
((SuperListener) parentFragment).onSomethingHappened(); 

यह समाधान केवल काम करता है जब संवाद वाला टुकड़े और गतिविधियों के चलते नहीं से बनाया जा रहा है, लेकिन आप एक पूर्ण समाधान प्रदान करने के लिए दोनों तरीकों ('setFragmentTarget()' और 'onAttach()' एक) प्लस कुछ क्लास चेकों को जोड़ सकते हैं।

+0

यह सार्वजनिक स्थैतिक mySuperFragmentDialog नया प्रवेश क्यों नहीं है और सार्वजनिक स्थैतिक शून्य नहीं है। मुझे यहां कोई रिटर्न स्टेटमेंट नहीं दिख रहा है। –

+0

रिटर्न गायब था, संपादित किया गया था। – juanmeanwhile

+0

@juanmeanwhile जानकारी के लिए धन्यवाद! लेकिन जहां से हमें श्रोता की आवश्यकता है, सुपरलिस्टनर श्रोता को तुरंत चालू कर दिया गया है? –

0

मुझे यह समस्या एक बार और हल करने के बाद हुई, मैंने एक प्रोजेक्ट बनाया जो मुझे याद दिलाएगा कि मैंने यह कैसे किया। मैंने परियोजना को जिथब पर रखा ताकि कोई भी समाधान देख सके। यहां लिंक है: https://github.com/mumasaba/FragmentFragmentBoss

इस प्रोजेक्ट में, हमारे पास 'हैलो वर्ल्ड' शब्द प्रदर्शित करने वाले टेक्स्ट व्यू के साथ एक साधारण ऐप है। यह टेक्स्ट व्यू एक खंड पर है जो मुख्य ऐप गतिविधि द्वारा होस्ट किया जाता है। इस खंड को एक नया शब्द प्रदर्शित करने की आवश्यकता है जिसे उपयोगकर्ता ऐड विकल्प मेनू आइकन पर क्लिक करने के बाद दर्ज कर सकता है। क्लिक करने पर, विकल्प मेनू आइटम एक संवाद को कॉल करता है जिससे उपयोगकर्ता अपने नए शब्द में टाइप कर सकता है। उपयोगकर्ता पूरा होने के बाद, वे संवाद को खारिज करने के लिए ठीक क्लिक कर सकते हैं और खंड के टेक्स्ट व्यू पर अपना नया इनपुट प्रदर्शित कर सकते हैं। इसलिए, डायलॉग फ्रैगमेंट संचार के लिए टुकड़ा चित्रित किया गया है।

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