मैं हाल ही में लगातार String
कुंजी पता करने के लिए जब मेरे Fragments
बनाने Bundles
में तर्क पारित करने के लिए होने के थक गया हो गया। तो मैंने अपने Fragments
के लिए कन्स्ट्रक्टर बनाने का फैसला किया जो पैरामीटर लेना चाहते थे, और String
कुंजी के साथ उन चर को Bundles
में डाल दें, इसलिए अन्य Fragments
और Activities
की आवश्यकता को समाप्त करने के लिए उन चाबियों को जानने की आवश्यकता है।एक टुकड़ा बनाना: निर्माता बनाम newInstance()
public ImageRotatorFragment() {
super();
Log.v(TAG, "ImageRotatorFragment()");
}
public ImageRotatorFragment(int imageResourceId) {
Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");
// Get arguments passed in, if any
Bundle args = getArguments();
if (args == null) {
args = new Bundle();
}
// Add parameters to the argument bundle
args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId);
setArguments(args);
}
और फिर मैं उन तर्कों को सामान्य की तरह खींचता हूं।
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG, "onCreate");
// Set incoming parameters
Bundle args = getArguments();
if (args != null) {
mImageResourceId = args.getInt(KEY_ARG_IMAGE_RES_ID, StaticData.getImageIds()[0]);
}
else {
// Default image resource to the first image
mImageResourceId = StaticData.getImageIds()[0];
}
}
हालांकि, एक प्रकार का वृक्ष इस के साथ इस मुद्दे को ले लिया और कहा कि अन्य मानकों के साथ कंस्ट्रक्टर्स साथ Fragment
की उपवर्गों के लिए नहीं, मुझे @SuppressLint("ValidFragment")
उपयोग करने के लिए भी अनुप्रयोग चलाने के लिए की जरूरत पड़ेगी। बात यह है कि यह कोड पूरी तरह से ठीक काम करता है। मैं ImageRotatorFragment(int imageResourceId)
या पुरानी स्कूल विधि ImageRotatorFragment()
का उपयोग कर सकता हूं और इसे मैन्युअल रूप से setArguments()
पर कॉल कर सकता हूं। जब एंड्रॉइड को फ्रैगमेंट (अभिविन्यास परिवर्तन या कम मेमोरी) को फिर से बनाने की आवश्यकता होती है, तो यह ImageRotatorFragment()
कन्स्ट्रक्टर को कॉल करता है और उसके बाद मेरे मानों के साथ Bundle
समान तर्क देता है, जो सही ढंग से सेट हो जाता है।
तो मैं "सुझाए गए" दृष्टिकोण की खोज कर रहा हूं और newInstance()
का उपयोग करके कई उदाहरण देखता हूं ताकि पैरामीटर के साथ Fragments
बनाया जा सके, जो मेरे कन्स्ट्रक्टर की तरह ही काम करता है। तो मैंने इसे परीक्षण करने के लिए अपना खुद का बना दिया, और यह पहले की तरह बेकार ढंग से काम करता है, इसके बारे में लिंट कम से कम लिंट।
public static ImageRotatorFragment newInstance(int imageResourceId) {
Log.v(TAG, "newInstance(int imageResourceId)");
ImageRotatorFragment imageRotatorFragment = new ImageRotatorFragment();
// Get arguments passed in, if any
Bundle args = imageRotatorFragment.getArguments();
if (args == null) {
args = new Bundle();
}
// Add parameters to the argument bundle
args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId);
imageRotatorFragment.setArguments(args);
return imageRotatorFragment;
}
मैं व्यक्तिगत रूप से लगता है कि निर्माताओं का उपयोग कर newInstance()
उपयोग करने के लिए जानने और पैरामीटर प्रदान करने की तुलना में काफी अधिक आम बात है। मेरा मानना है कि आप इस कन्स्ट्रक्टर तकनीक का उपयोग गतिविधियों के साथ कर सकते हैं और लिंट इसके बारे में शिकायत नहीं करेंगे। तो मूल रूप से मेरा सवाल यह है कि Google क्यों नहीं चाहता कि आप Fragments
के लिए पैरामीटर के साथ रचनाकारों का उपयोग करें?
मेरा एकमात्र अनुमान यह है कि आप Bundle
का उपयोग किए बिना एक इंस्टेंस चर सेट करने का प्रयास नहीं करते हैं, जो Fragment
पुनर्निर्मित होने पर सेट नहीं होगा। static newInstance()
विधि का उपयोग करके, कंपाइलर आपको एक आवृत्ति चर तक पहुंचने नहीं देगा।
public ImageRotatorFragment(int imageResourceId) {
Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");
mImageResourceId = imageResourceId;
}
मुझे अभी भी ऐसा नहीं लगता है कि यह रचनाकारों में पैरामीटर के उपयोग को अस्वीकार करने का पर्याप्त कारण है। किसी और को इस में अंतर्दृष्टि है?