10

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

उत्तर

17

एक अच्छा समाधान सभी टुकड़ों के लिए समान ऑनफ्रैगमेंट इंटेक्शन लिस्टर का उपयोग कर सकता है, और प्रत्येक श्रोता विधियों (जैसे एक पैरामीटर की तरह) का एक पैरा का उपयोग करने के लिए यह पता लगाने के लिए कि किस खंड ने कार्रवाई भेजी है।

यहाँ एक उदाहरण:

public void onFragmentMessage(String TAG, Object data){ 
    if (TAG.equals("TAGFragment1")){ 
     //Do something with 'data' that comes from fragment1 
    } 
    else if (TAG.equals("TAGFragment2")){ 
     //Do something with 'data' that comes from fragment2 
    } 
    ... 
} 

आप उपयोग कर सकते हैं:

एक नया वर्ग और हर टुकड़ा इस वर्ग

OnFragmentInteractionListener.java

public interface OnFragmentInteractionListener { 
    public void onFragmentMessage(String TAG, Object data); 
} 

का उपयोग अपनी गतिविधि में बनाओ ऑब्जेक्ट प्रकार जो आप चाहते हैं हर प्रकार के डेटा को पारित करने के लिए (फिर, हमेशा में वाई अगर, आपको वस्तु को उस प्रकार में परिवर्तित करना होगा जो आवश्यक थे)।

इस तरह से, रखरखाव 6 differents श्रोताओं के मुकाबले आसान है और हर प्रकार के डेटा के लिए एक विधि है जिसे आप पास करना चाहते हैं।

उम्मीद है कि इससे मदद मिलती है।

5

neonamu's answer में सुधार लाने के मेरे प्रयास:

आप ऊपर निर्दिष्ट की तरह एक अंतरफलक परिभाषित कर सकते हैं, लेकिन सामान्य से एक

public interface OnListFragmentInteractionListener<T> { 

     void onListFragmentInteraction(String tag, T data); 
} 

तब मेजबान गतिविधि में आप यह विशेष प्रकार आप चाहते हैं के लिए लागू कर सकते हैं एक, या की तरह वस्तु के लिए ऊपर का सुझाव दिया:

public class MyFragActivity implements OnListFragmentInteractionListener<Object> { 
    ... 

    @Override 
    public void onListFragmentInteraction(String tag, Object data) { 
      //do some stuff with the data 
    } 
} 

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

+1

एक आकर्षण की तरह काम करता है। आपका बहुत बहुत धन्यवाद! –

+0

मैं सोच रहा था कि आप @ ओवरराइड का उपयोग क्यों करते हैं और उपयोगकर्ता नियोनामु नहीं करता है। क्या दोनों काम करते हैं? – Burkely91

+1

@ बुर्कली 9 1 हां यह इसके बिना काम करेगा। लेकिन आपको इसका इस्तेमाल करना चाहिए। जावा में ओवरराइड एनोटेशन एक चेक/सत्यापन होना है जो आप वास्तव में ओवरराइड कर रहे हैं जो आपको लगता है कि आप हैं (यदि आप उदाहरण के लिए पैरामीटर भूल जाते हैं तो यह एक त्रुटि की रिपोर्ट करेगा) ओवरराइड के बिना आप बस एक नई विधि को परिभाषित करेंगे एक ही नाम के साथ अलग-अलग पैरामीटर (ओवरलोड लोड करना) और इंटरफ़ेस को कार्यान्वित नहीं करना – HenriqueMS

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