हाँ, वो करते हैं।
आप वास्तव में वैसे भी निर्माता को ओवरराइड नहीं करना चाहिए। आपके पास एक newInstance()
स्थिर विधि होनी चाहिए और किसी भी पैरामीटर को तर्कों (बंडल) के माध्यम से पास करना चाहिए
उदाहरण के लिए:
public static final MyFragment newInstance(int title, String message) {
MyFragment f = new MyFragment();
Bundle bdl = new Bundle(2);
bdl.putInt(EXTRA_TITLE, title);
bdl.putString(EXTRA_MESSAGE, message);
f.setArguments(bdl);
return f;
}
और निश्चित रूप से इस तरह से आर्गल्स को हथियाना:
@Override
public void onCreate(Bundle savedInstanceState) {
title = getArguments().getInt(EXTRA_TITLE);
message = getArguments().getString(EXTRA_MESSAGE);
//...
//etc
//...
}
तब आप अपने खंड प्रबंधक से तुरंत इन्कार करेंगे:
@Override
public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState == null){
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content, MyFragment.newInstance(
R.string.alert_title,
"Oh no, an error occurred!")
)
.commit();
}
}
इस तरह से यदि अलग किया गया और ऑब्जेक्ट स्टेट को फिर से अटैच किया गया तो उसे तर्कों के माध्यम से संग्रहीत किया जा सकता है। बहुत कुछ बंडलों की तरह है जो इरादों से जुड़ा हुआ है।
कारण - अतिरिक्त पढ़ना
मैंने सोचा कि मैं समझाऊंगा कि लोग सोच क्यों रहे हैं।
यदि आप जांच करते हैं: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/Fragment.java
आप देखेंगे instantiate(..)
में विधि Fragment
वर्ग कॉल newInstance
विधि:
public static Fragment instantiate(Context context, String fname, @Nullable Bundle args) {
try {
Class<?> clazz = sClassMap.get(fname);
if (clazz == null) {
// Class not found in the cache, see if it's real, and try to add it
clazz = context.getClassLoader().loadClass(fname);
if (!Fragment.class.isAssignableFrom(clazz)) {
throw new InstantiationException("Trying to instantiate a class " + fname
+ " that is not a Fragment", new ClassCastException());
}
sClassMap.put(fname, clazz);
}
Fragment f = (Fragment) clazz.getConstructor().newInstance();
if (args != null) {
args.setClassLoader(f.getClass().getClassLoader());
f.setArguments(args);
}
return f;
} catch (ClassNotFoundException e) {
throw new InstantiationException("Unable to instantiate fragment " + fname
+ ": make sure class name exists, is public, and has an"
+ " empty constructor that is public", e);
} catch (java.lang.InstantiationException e) {
throw new InstantiationException("Unable to instantiate fragment " + fname
+ ": make sure class name exists, is public, and has an"
+ " empty constructor that is public", e);
} catch (IllegalAccessException e) {
throw new InstantiationException("Unable to instantiate fragment " + fname
+ ": make sure class name exists, is public, and has an"
+ " empty constructor that is public", e);
} catch (NoSuchMethodException e) {
throw new InstantiationException("Unable to instantiate fragment " + fname
+ ": could not find Fragment constructor", e);
} catch (InvocationTargetException e) {
throw new InstantiationException("Unable to instantiate fragment " + fname
+ ": calling Fragment constructor caused an exception", e);
}
}
http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#newInstance () बताती है कि, इंस्टेंटेशन पर यह क्यों जाँचता है कि एक्सेसर है public
और यह कि क्लास लोडर इसे एक्सेस कर रहा है।
यह सब में एक बहुत बुरा तरीका है, लेकिन यह राज्यों FragmentManger
को मारने और फिर Fragments
से बनाने की अनुमति देता है। (एंड्रॉइड सबसिस्टम इसी तरह की चीजों को करता है Activities
)।
उदाहरण वर्ग
मुझे कॉल करने के बारे में बहुत कुछ पूछा जाता है newInstance
। इसे क्लास विधि से भ्रमित न करें। इस पूरे वर्ग उदाहरण का उपयोग दिखाना चाहिए।
/**
* Created by chris on 21/11/2013
*/
public class StationInfoAccessibilityFragment extends BaseFragment implements JourneyProviderListener {
public static final StationInfoAccessibilityFragment newInstance(String crsCode) {
StationInfoAccessibilityFragment fragment = new StationInfoAccessibilityFragment();
final Bundle args = new Bundle(1);
args.putString(EXTRA_CRS_CODE, crsCode);
fragment.setArguments(args);
return fragment;
}
// Views
LinearLayout mLinearLayout;
/**
* Layout Inflater
*/
private LayoutInflater mInflater;
/**
* Station Crs Code
*/
private String mCrsCode;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCrsCode = getArguments().getString(EXTRA_CRS_CODE);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mInflater = inflater;
return inflater.inflate(R.layout.fragment_station_accessibility, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mLinearLayout = (LinearLayout)view.findViewBy(R.id.station_info_accessibility_linear);
//Do stuff
}
@Override
public void onResume() {
super.onResume();
getActivity().getSupportActionBar().setTitle(R.string.station_info_access_mobility_title);
}
// Other methods etc...
}