7

शीर्षक कहता है, मैं यह पता लगाने की कोशिश कर रहा हूं कि फ्रैगमेंट में निर्भरता को इंजेक्ट करने का सबसे अच्छा तरीका कौन सा है। मैं रोबोगुइस इत्यादि जैसे बाहरी ढांचे से स्वतंत्र होना चाहता हूंएंड्रॉइड फ्रैगमेंट एंड निर्भरता इंजेक्शन

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

public static Fragment newInstance() { 
    final Bundle bundle = new Bundle(); 
    ... 
    final Fragment fragment = new MyFragment(); 
    fragment.setArguments(bundle); 
    return fragment; 
} 

मैं अपनी निर्भरता को टुकड़े में कैसे पारित कर सकता हूं? क्या मुझे इसे पार्सेलबल या सीरियलज़ेबल इंटरफेस को कार्यान्वित करना चाहिए और फिर इसे बंडल में पैक करना चाहिए? क्या परिणाम प्राप्त करने का कोई और तरीका है?

धन्यवाद!

उत्तर

0

आप अपनी गतिविधि से निर्भरता क्यों नहीं लेते?

public void onActivityCreated(Bundle b){ 
    super.onActivityCreated(b) 
    DependencyClass c = ((MyActivity)getActivity()).getDependency(); 
} 
+1

मैं इस मैं गतिविधि सही करने के लिए टुकड़ा युग्मन पहुंच जाएंगे तरह करते हैं? मैं अभी भी टुकड़ा स्वतंत्र और पुन: प्रयोज्य होना चाहता हूं। – TheImplementer

7

एक सरल समाधान एक इंटरफेस घोषित करना है जो टुकड़े के लिए आवश्यक निर्भरता घोषित कर रहा है। फिर फ्रैगमेंट का संदर्भ इस इंटरफ़ेस को कार्यान्वित करें, और संदर्भ से आवश्यक होने पर निर्भरताओं को मतदान करें।

अनुबंध:

public interface MyDependencies { 

    MyDep getDep(); 

} 

गतिविधि:

public MyActivity extends Activity implements MyDependencies { 

    @Override 
    public MyDep getDep(){ 
     return createMyDependencyOrGetItFromASingletonOrGetItFromApplication() 
    } 
} 

टुकड़ा:

public void onActivityCreated(Bundle b){ 
    super.onActivityCreated(b) 

    if (getActivity() instanceOf MyDependencies) { 
     MyDep dep = ((MyDependencies) getActivity).getDep(); 
    } else { 
     throw new RuntimeException("Context does not support the Fragment, implement MyDependencies") 
    } 
} 

तो, वास्तव में, वहाँ गतिविधि के लिए कोई अनावश्यक युग्मन है, क्योंकि अनुबंध द्वारा परिभाषित किया गया है एक इंटरफ़ेस

0

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

Fragment MyFragment { 

Depend mDepend; 

.... 


    public void setDepend(Depend depend) { 
     mDepend = depend; 
    } 

} 

फिर आपकी गतिविधि में आप ऑनक्रेट विधि में निर्भरता को इंजेक्ट कर सकते हैं।

तो अपनी गतिविधि में कुछ इस तरह:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map); 
    MapFragment wrapperFragment = new WrapperFragment(); 
    if (savedInstanceState == null) { 
     getFragmentManager().beginTransaction() 
       .add(R.id.map_container, wrapperFragment).commit(); 
    // find the fragment 
    // call the setter 
    } 
} 
+0

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

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