2016-04-05 6 views
6

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

पहले खंड से डेटा को अंतिम रूप से कैसे पास किया जाए?

1) मैं टुकड़ों की सभी श्रृंखलाओं से गुजरना नहीं चाहता, क्योंकि उन्हें इस डेटा की आवश्यकता नहीं है।

2) Activity होस्टिंग में यह डेटा स्टोर करें, मुझे ((SomeActivity)getActivity()).getUserData() को Fragment कक्षा के अंदर कॉल करने और प्रस्तुतकर्ता को यह डेटा पास करने की आवश्यकता है।

3) मैंने अंतिम दृष्टिकोण चुना है। मैंने सिंगलटन उपयोगकर्ता डेटा वर्ग बनाया है। यह सरल POJO वर्ग है। मैं पहले Fragment में आवश्यक डेटा सेट करने के लिए UserData का उदाहरण बना रहा हूं और डेटा को पुनर्प्राप्त करने और अनुपलब्ध फ़ील्ड जोड़ने के लिए अंतिम Fragment में इसका उपयोग करने से पहले।

लेकिन मुझे नहीं पता कि सिंगलटन सही समाधान के साथ दृष्टिकोण है। क्योंकि जब मैं Activity पर जाता हूं तो मुझे सिंगलटन इंस्टेंस को साफ़ करने की आवश्यकता होती है। यदि बेहतर समाधान है?

संपादित

मैं EventBus बारे में सोचा। लेकिन मुझे फ्रैगमेंट से प्रेजेंटर तक डेटा पास करना होगा। अब मैं वर्तमान में UserData.getInstance() पर कॉल करता हूं और डेटा पुनर्प्राप्त करता हूं। मैं चाहता हूं कि कोड अधिक सुरुचिपूर्ण और सही हो। मैं अधिक अनुभवी डेवलपर्स की राय सुनने के लिए कह रहा हूं कि उपयोग करने के लिए बेहतर क्या है।

+0

क्या आप 'SharedPref' का उपयोग नहीं कर सकते? –

+0

@ रोहित आर्य मुझे नहीं लगता कि यह गतिविधि के अंदर डेटा पकड़ने से बेहतर समाधान है। मुझे सर्वर पर भेजने के लिए केवल यह डेटा चाहिए, लंबे समय तक नहीं –

+0

फिर सिंगलटन एक अच्छा दृष्टिकोण होगा। –

उत्तर

2

मैं इसे ModellViewPresenter रास्ता

class CustomerModel { 
    String phoneNumber 
} 

interface ICustomerOwner { 
    CustomerModel getCustomer() 
} 

class CustomerRegistrationWorkflowActivity extends Activity implements ICustomerOwner { 
    CustomerModel getCustomer() 
    ... 
} 

class CustomerContactDataFragment // fragment1 where you edit the phone number. 

class CustomerRegistrationSummaryFragment // fragment5 showing all data plus submit button) 

करना होगा के बाद से मॉडल (CustomerRegistrationWorkflow) गतिविधि में रहती टुकड़े

((ICustomerOwner) getActivity()).getCustomer() 
2

एक वर्ग (फ्रैगमेंट्स) से दूसरे डेटा में डेटा भेजने के कई तरीके हैं।

फ्रैगमेंट के जीवन चक्र के मुद्दों को ध्यान में रखते हुए। आप बिना किसी परेशानी के एक इवेंट बस का उपयोग कर सकते हैं।

class FragmentA { 
    Bus bus; 

    onCreate(){ 
     bus = new Bus(); 
    } 

    @Subscribe public void receiveMessage(String message) { 
     // TODO: Parse your message 
    } 

    onResume(){ 
     bus.register(this); 
    } 

    onPause(){ 
     bus.unregister(this); 
    } 
} 

class FragmentB { 

    onCreate(){ 
     bus.post("You have a message"); 
    } 
} 

here को एकीकृत करने पर अधिक। या ऐसे कई अन्य विकल्प भी हैं। https://greenrobot.github.io/EventBus/

+0

मैंने इवेंटबस के बारे में सोचा। लेकिन मैंने अपने प्रश्न के लिए टिप्पणी में लिखा था। मुझे 'फ्रैगमेंट' से प्रस्तुतकर्ता तक डेटा पास करना होगा। अब मैं वर्तमान में 'UserData.getInstance()' को कॉल करता हूं और डेटा पुनर्प्राप्त करता हूं। मैं चाहता हूं कि कोड अधिक सुरुचिपूर्ण हो और –

+2

सही भी हो यदि आपके पास कुछ है। इसे अपने प्रश्न में जोड़ें। आप कुछ जवाब देने के लिए अपने प्रश्न और आपकी टिप्पणियों को तैयार करने की उम्मीद कैसे करते हैं? – amalBit

+0

मैंने अपना क्यूशन अपडेट किया है –

0

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

किसी गतिविधि से जुड़ा एक टुकड़ा getActivity() विधि द्वारा गतिविधि के उदाहरण तक पहुंच सकता है और इस उदाहरण के साथ, विभाजन गतिविधि के तरीकों को कॉल करने जैसे कार्यों को कर सकता है।

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

गतिविधि के बारे में अधिक जानकारी और टुकड़ा के संचार के लिए, लिंक पर जाएँ: http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

1

एक सुरुचिपूर्ण समाधान घटना बस, अन्य का उपयोग करते हुए कहता है - पुराने अच्छा कॉलबैक। मेरा दृष्टिकोण "टुकड़ों की श्रृंखला" की स्थिति से बचने के लिए है - जब एक टुकड़ा सीधे दूसरे को कॉल करता है। अगर गतिविधि पूरी तरह से टुकड़े प्रतिस्थापन को संभालती है तो इसमें सभी 5 खंडों के बराबर पहुंच होती है। इसलिए यह कॉलबैक का उपयोग करके आसानी से डेटा पास कर सकता है।

उस मामले में एमवीपी के साथ कोई समस्या नहीं दिख रही है। प्रेजेंटर अपने दृश्य (फ्रैगमेंट) में डेटा भेजने के लिए कॉलबैक का उपयोग करता है। फ्रैगमेंट अपनी गतिविधि को डेटा भेजने के लिए कॉलबैक का उपयोग करें। गतिविधि तब खंड प्रबंधक में 5 वें खंड और 5 वें खंड में अद्यतन/पास डेटा पाएं।

कॉलबैक के साथ स्थिति घटना बस की तुलना में अधिक मजबूत लगती है, लेकिन अभी भी स्वाद की बात है।

0

मैं बहुत मिला है फोन करके मॉडल के साथ बातचीत कर सकता डेटा को पारित करने या पारस्परिक रूप से खंड पारित करने के मुद्दों के बारे में। नतीजतन, मैंने डेटाकैच को किसी ऑब्जेक्ट को कहीं भी पास कर दिया।

यह बहुत आसान उदाहरण है। Gihub : Android DataCache

रिसीवर

के लिए भेजने वाले

public class FragmentA { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     String msg = "the phone number" 
     DataCache.getInstance().push(msg); 
    } 
} 

टुकड़ा के लिए टुकड़ा

public class FragmentB { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String msg = DataCache.getInstance().pop(String.class); } } 

यह कोशिश: डी मुझे आशा है कि आप मदद करने के लिए।

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