যদিও @yydl newInstance
পদ্ধতিটি আরও ভাল কেন তার জন্য একটি বাধ্যতামূলক কারণ দেয় :
যদি অ্যান্ড্রয়েড পরে আপনার ফ্রেগমেন্টটি পুনরায় তৈরি করার সিদ্ধান্ত নেয়, এটি আপনার খণ্ডটির নো-আর্গুমেন্ট কনস্ট্রাক্টরকে কল করতে চলেছে। সুতরাং নির্মাণকারীকে ওভারলোড করা কোনও সমাধান নয়।
এটি এখনও কনস্ট্রাক্টর ব্যবহার করা বেশ সম্ভব । এটি কেন তা দেখার জন্য প্রথমে আমাদের দেখতে হবে যে উপরের ওয়ার্কআউন্ডটি অ্যান্ড্রয়েড কেন ব্যবহার করে।
কোনও খণ্ড ব্যবহার করার আগে একটি উদাহরণ প্রয়োজন। অ্যান্ড্রয়েড কলগুলি 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
}
আরও ব্যাখ্যা হিসাবে, এখানে অ্যান্ড্রয়েডের টুকরা ক্লাস:
/**
* 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
কারখানার পদ্ধতিতে এড়াতে পারেন ।
সম্পাদনা : অ্যান্ড্রয়েড আর টুকরো টুকরো করার জন্য একটি ওভারলোডেড কনস্ট্রাক্টর ব্যবহারের অনুমতি দেয় না। আপনার অবশ্যই newInstance
পদ্ধতিটি ব্যবহার করা উচিত ।