जबकि @yydl एक सम्मोहक कारण देता है कि newInstance
विधि बेहतर क्यों है:
यदि एंड्रॉइड बाद में आपके फ्रैगमेंट को फिर से बनाने का फैसला करता है, तो यह आपके टुकड़े के नो-तर्क निर्माता को कॉल करने वाला है। इसलिए निर्माणकर्ता को ओवरलोड करना कोई समाधान नहीं है।
एक निर्माता का उपयोग करना अभी भी काफी संभव है । यह क्यों है, यह देखने के लिए, पहले हमें यह देखने की आवश्यकता है कि एंड्रॉइड द्वारा उपरोक्त वर्कअराउंड का उपयोग क्यों किया जाता है।
एक टुकड़े का उपयोग करने से पहले, एक उदाहरण की आवश्यकता है। Android कॉल YourFragment()
( कोई तर्क निर्माता नहीं) खंड का एक उदाहरण का निर्माण करने के लिए। यहां आपके द्वारा लिखे गए किसी भी अतिभारित निर्माता को अनदेखा किया जाएगा, क्योंकि एंड्रॉइड यह नहीं जान सकता है कि किसका उपयोग करना है।
एक गतिविधि के जीवनकाल में, टुकड़ा ऊपर के रूप में बनाया जाता है और कई बार एंड्रॉइड द्वारा नष्ट कर दिया जाता है। इसका अर्थ है कि यदि आप डेटा को खंड ऑब्जेक्ट में डालते हैं, तो यह टुकड़ा नष्ट हो जाने पर खो जाएगा।
वर्कअराउंड करने के लिए, एंड्रॉइड पूछता है कि आप Bundle
(कॉलिंग setArguments()
) का उपयोग करके डेटा स्टोर करते हैं , जिसे तब से एक्सेस किया जा सकता है YourFragment
। तर्क bundle
एस एंड्रॉइड द्वारा संरक्षित हैं, और इसलिए लगातार बने रहने की गारंटी है ।
इस बंडल को सेट करने का एक newInstance
तरीका स्थिर विधि का उपयोग करना है :
public static YourFragment newInstance (int data) {
YourFragment yf = new YourFragment()
/* See this code gets executed immediately on your object construction */
Bundle args = new Bundle();
args.putInt("data", data);
yf.setArguments(args);
return yf;
}
हालांकि, एक निर्माता:
public YourFragment(int data) {
Bundle args = new Bundle();
args.putInt("data", data);
setArguments(args);
}
newInstance
विधि के रूप में बिल्कुल वैसा ही कर सकते हैं ।
स्वाभाविक रूप से, यह विफल हो जाएगा, और एक कारण है कि एंड्रॉइड आपको newInstance
विधि का उपयोग करना चाहता है :
public YourFragment(int data) {
this.data = data; // Don't do this
}
आगे की व्याख्या के रूप में, यहाँ Android के Fragment Class है:
/**
* Supply the construction arguments for this fragment. This can only
* be called before the fragment has been attached to its activity; that
* is, you should call it immediately after constructing the fragment. The
* arguments supplied here will be retained across fragment destroy and
* creation.
*/
public void setArguments(Bundle args) {
if (mIndex >= 0) {
throw new IllegalStateException("Fragment already active");
}
mArguments = args;
}
ध्यान दें कि एंड्रॉइड पूछता है कि तर्क केवल निर्माण पर सेट किए गए हैं, और गारंटी देता है कि इन्हें बनाए रखा जाएगा।
संपादित करें : जैसा कि @JHH द्वारा टिप्पणियों में बताया गया है, यदि आप एक कस्टम कंस्ट्रक्टर प्रदान कर रहे हैं जिसमें कुछ तर्कों की आवश्यकता होती है, तो जावा आपके टुकड़े को बिना किसी आर्ग डिफॉल्ट कंस्ट्रक्टर के साथ प्रदान नहीं करेगा । तो इसके लिए आपको एक arg कंस्ट्रक्टर को परिभाषित करने की आवश्यकता होगी , जो कोड है जिसे आप newInstance
फ़ैक्टरी विधि से बचा सकते हैं ।
संपादित करें : Android अब टुकड़ों के लिए एक अतिभारित निर्माता का उपयोग करने की अनुमति नहीं देता है। आपको newInstance
विधि का उपयोग करना चाहिए ।