সমস্যার সংক্ষিপ্তসার
দ্রষ্টব্য: এই উত্তরে আমি রেফারেন্স FragmentPagerAdapterএবং এর উত্স কোড যাচ্ছি । তবে সাধারণ সমাধানটিও প্রয়োগ করা উচিত FragmentStatePagerAdapter।
আপনি যদি এটি পড়েন তবে আপনি সম্ভবত জানেন যে FragmentPagerAdapter/ আপনার FragmentStatePagerAdapterজন্য তৈরি করা Fragmentsহয়েছিল ViewPager, তবে ক্রিয়াকলাপের বিনোদন (কোনও ডিভাইস রোটেশন বা মেমরি ফিরে পেতে আপনার অ্যাপ্লিকেশনটিকে মেরে ফেলা সিস্টেম থেকে) সেগুলি Fragmentsআর তৈরি করা হবে না, পরিবর্তে তাদের দৃষ্টান্ত থেকে উদ্ধার করাFragmentManager । এখন বলুন যে Activityএগুলিতে Fragmentsকাজ করার জন্য আপনার একটি রেফারেন্স পাওয়া দরকার। আপনার অভ্যন্তরীণভাবে সেট করুন কারণ এগুলি তৈরির জন্য আপনার কোনও idবা নেই । সুতরাং সমস্যাটি কীভাবে সেই তথ্য ছাড়াই তাদের একটি রেফারেন্স পাবেন ...tagFragmentsFragmentPagerAdapter
বর্তমান সমাধানগুলির সাথে সমস্যা: অভ্যন্তরীণ কোডের উপর নির্ভর করে
সমাধান আমি এই এবং অনুরূপ প্রশ্নে দেখা করেছি অনেক বিদ্যমান একটি রেফারেন্স পেয়ে উপর নির্ভর Fragmentকল করে FragmentManager.findFragmentByTag()এবং অনুকারী অভ্যন্তরীণভাবে নির্মিত ট্যাগ: "android:switcher:" + viewId + ":" + id। এটির সাথে সমস্যাটি হ'ল আপনি অভ্যন্তরীণ উত্স কোডের উপর নির্ভর করছেন যা আমরা সকলেই জানি যে চিরকাল একই থাকবে তার নিশ্চয়তা দেওয়া হয় না। গুগলের অ্যান্ড্রয়েড ইঞ্জিনিয়াররা সহজেই tagকাঠামোগত পরিবর্তন করার সিদ্ধান্ত নিতে পারে যা আপনার কোডটি ভেঙে দেবে যার ফলে আপনি বিদ্যমানটির কোনও রেফারেন্স খুঁজে পেতে পারেন না Fragments।
অভ্যন্তরীণ উপর নির্ভর না করে বিকল্প সমাধান tag
এটির মাধ্যমে অভ্যন্তরীণ সেটটির উপর নির্ভর করে না যে কীভাবে Fragmentsফিরে আসে তার একটি রেফারেন্স কীভাবে পাবেন তার একটি সাধারণ উদাহরণ এখানে । কী ওভাররাইড হয় সেখানে এবং তথ্যসূত্র সংরক্ষণ পরিবর্তে এর মধ্যে ।FragmentPagerAdaptertagsFragmentsinstantiateItem()getItem()
public class SomeActivity extends Activity {
private FragmentA m1stFragment;
private FragmentB m2ndFragment;
private class CustomPagerAdapter extends FragmentPagerAdapter {
public CustomPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new FragmentA();
case 1:
return new FragmentB();
default:
return null;
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
switch (position) {
case 0:
m1stFragment = (FragmentA) createdFragment;
break;
case 1:
m2ndFragment = (FragmentB) createdFragment;
break;
}
return createdFragment;
}
}
public void someMethod() {
if (m1stFragment != null) {
}
if (m2ndFragment != null) {
}
}
}
অথবা আপনি যদি tagsশ্রেণীর সদস্যের পরিবর্তনশীল / রেফারেন্সের পরিবর্তে কাজ করতে পছন্দ করেন তবে আপনি একই পদ্ধতিতে সেটটিও Fragmentsদখল করতে পারেন : দ্রষ্টব্য: এটি তৈরি করার সময় এটি সেট না হওয়ার কারণে এটি প্রযোজ্য নয় ।tagsFragmentPagerAdapterFragmentStatePagerAdaptertagsFragments
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
switch (position) {
case 0:
String firstTag = createdFragment.getTag();
break;
case 1:
String secondTag = createdFragment.getTag();
break;
}
return createdFragment;
}
মনে রাখবেন যে এই পদ্ধতিটি অভ্যন্তরীণ tagসেটটি নকল করার উপর নির্ভর করে না FragmentPagerAdapterএবং পরিবর্তে তাদের পুনরুদ্ধারের জন্য যথাযথ এপিআই ব্যবহার করে। এইভাবে এমনকি tagভবিষ্যতের সংস্করণগুলির পরিবর্তনগুলি SupportLibraryআপনি এখনও নিরাপদ থাকবেন।
ভুলবেন না যে, আপনার নকশা উপর নির্ভর করে Activity, Fragmentsআপনি কাজ করতে পারে চেষ্টা করছেন বা করে যে জন্য এখনো অস্তিত্ব নাও থাকতে পারে, তাই আপনি অ্যাকাউন্টে nullআপনার রেফারেন্স ব্যবহার করার আগে চেক।
এছাড়াও, পরিবর্তে যদি আপনি কাজ করে যাচ্ছেন FragmentStatePagerAdapter, তবে আপনি কঠোর উল্লেখগুলি আপনার কাছে রাখতে চান না Fragmentsকারণ আপনার অনেকগুলি থাকতে পারে এবং কঠোর উল্লেখগুলি অযথা তাদের স্মৃতিতে রাখে। পরিবর্তে মানগুলির পরিবর্তে পরিবর্তনগুলিতে Fragmentরেফারেন্সগুলি সংরক্ষণ করুন WeakReference। এটার মত:
WeakReference<Fragment> m1stFragment = new WeakReference<Fragment>(createdFragment);
Fragment firstFragment = m1stFragment.get();
if (firstFragment != null) {
}