হ্যাঁ তারা করে.
আপনার কোনওভাবেই কনস্ট্রাক্টরকে ওভাররাইড করা উচিত নয়। আপনার একটি 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/Fraament.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
এবং সেই শ্রেণীর লোডার এতে প্রবেশ করতে দেয় access
এটি সর্বোপরি একটি সুন্দর বাজে পদ্ধতি, তবে এটি রাষ্ট্রগুলিকে 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...
}