সমস্যার সংক্ষিপ্তসার
দ্রষ্টব্য: এই উত্তরে আমি রেফারেন্স FragmentPagerAdapter
এবং এর উত্স কোড যাচ্ছি । তবে সাধারণ সমাধানটিও প্রয়োগ করা উচিত FragmentStatePagerAdapter
।
আপনি যদি এটি পড়েন তবে আপনি সম্ভবত জানেন যে FragmentPagerAdapter
/ আপনার FragmentStatePagerAdapter
জন্য তৈরি করা Fragments
হয়েছিল ViewPager
, তবে ক্রিয়াকলাপের বিনোদন (কোনও ডিভাইস রোটেশন বা মেমরি ফিরে পেতে আপনার অ্যাপ্লিকেশনটিকে মেরে ফেলা সিস্টেম থেকে) সেগুলি Fragments
আর তৈরি করা হবে না, পরিবর্তে তাদের দৃষ্টান্ত থেকে উদ্ধার করাFragmentManager
। এখন বলুন যে Activity
এগুলিতে Fragments
কাজ করার জন্য আপনার একটি রেফারেন্স পাওয়া দরকার। আপনার অভ্যন্তরীণভাবে সেট করুন কারণ এগুলি তৈরির জন্য আপনার কোনও id
বা নেই । সুতরাং সমস্যাটি কীভাবে সেই তথ্য ছাড়াই তাদের একটি রেফারেন্স পাবেন ...tag
Fragments
FragmentPagerAdapter
বর্তমান সমাধানগুলির সাথে সমস্যা: অভ্যন্তরীণ কোডের উপর নির্ভর করে
সমাধান আমি এই এবং অনুরূপ প্রশ্নে দেখা করেছি অনেক বিদ্যমান একটি রেফারেন্স পেয়ে উপর নির্ভর Fragment
কল করে FragmentManager.findFragmentByTag()
এবং অনুকারী অভ্যন্তরীণভাবে নির্মিত ট্যাগ: "android:switcher:" + viewId + ":" + id
। এটির সাথে সমস্যাটি হ'ল আপনি অভ্যন্তরীণ উত্স কোডের উপর নির্ভর করছেন যা আমরা সকলেই জানি যে চিরকাল একই থাকবে তার নিশ্চয়তা দেওয়া হয় না। গুগলের অ্যান্ড্রয়েড ইঞ্জিনিয়াররা সহজেই tag
কাঠামোগত পরিবর্তন করার সিদ্ধান্ত নিতে পারে যা আপনার কোডটি ভেঙে দেবে যার ফলে আপনি বিদ্যমানটির কোনও রেফারেন্স খুঁজে পেতে পারেন না Fragments
।
অভ্যন্তরীণ উপর নির্ভর না করে বিকল্প সমাধান tag
এটির মাধ্যমে অভ্যন্তরীণ সেটটির উপর নির্ভর করে না যে কীভাবে Fragments
ফিরে আসে তার একটি রেফারেন্স কীভাবে পাবেন তার একটি সাধারণ উদাহরণ এখানে । কী ওভাররাইড হয় সেখানে এবং তথ্যসূত্র সংরক্ষণ পরিবর্তে এর মধ্যে ।FragmentPagerAdapter
tags
Fragments
instantiateItem()
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
দখল করতে পারেন : দ্রষ্টব্য: এটি তৈরি করার সময় এটি সেট না হওয়ার কারণে এটি প্রযোজ্য নয় ।tags
FragmentPagerAdapter
FragmentStatePagerAdapter
tags
Fragments
@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) {
}