আমি টুকরো টুকরোটি কীভাবে ব্যবহার করব তা শিখছি। আমার তিনটি উদাহরণ Fragment
ক্লাসের শীর্ষে শুরু করা হয়েছে। আমি এই জাতীয় ক্রিয়াকলাপে খণ্ডটি যুক্ত করছি:
ঘোষণা এবং সূচনা:
Fragment A = new AFragment();
Fragment B = new BFragment();
Fragment C = new CFragment();
/ যোগ করার পদ্ধতি প্রতিস্থাপন করা হচ্ছে:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, A);
ft.addToBackStack(null);
ft.commit();
এই স্নিপেটগুলি সঠিকভাবে কাজ করছে। প্রতিটি খণ্ড ক্রিয়াকলাপের সাথে সংযুক্ত থাকে এবং কোনও সমস্যা ছাড়াই পিছনের স্ট্যাকে সংরক্ষণ করা হয়।
সুতরাং যখন আমি লঞ্চ A
, C
, এবং তারপর B
, ভালো স্ট্যাক দেখায়:
| |
|B|
|C|
|A|
___
এবং যখন আমি 'পিছনে' বোতাম টিপুন, B
ধ্বংস হয়ে যায় এবং C
পুনরায় চালু করা হয়।
তবে, যখন আমি A
দ্বিতীয় বার টুকরোটি শুরু করি , পিছনের স্ট্যাক থেকে আবার শুরু করার পরিবর্তে, এটি পিছনের স্ট্যাকের শীর্ষে যুক্ত করা হয়
| |
|A|
|C|
|A|
___
তবে আমি এর A
উপরে থাকা সমস্ত টুকরোগুলি পুনরায় শুরু করতে এবং ধ্বংস করতে চাই (যদি থাকে)। আসলে, আমি ঠিক ডিফল্ট ব্যাক স্ট্যাক আচরণ পছন্দ করি।
আমি কীভাবে এটি সম্পাদন করব?
প্রত্যাশিত: ( A
আবার শুরু করা উচিত এবং শীর্ষ খণ্ডগুলি ধ্বংস করা উচিত)
| |
| |
| |
|A|
___
সম্পাদনা: (এ - সি দ্বারা প্রস্তাবিত)
এটি আমার চেষ্টা কোড:
private void selectItem(int position) {
Fragment problemSearch = null, problemStatistics = null;
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
String backStateName = null;
Fragment fragmentName = null;
boolean fragmentPopped = false;
switch (position) {
case 0:
fragmentName = profile;
break;
case 1:
fragmentName = submissionStatistics;
break;
case 2:
fragmentName = solvedProblemLevel;
break;
case 3:
fragmentName = latestSubmissions;
break;
case 4:
fragmentName = CPExercise;
break;
case 5:
Bundle bundle = new Bundle();
bundle.putInt("problem_no", problemNo);
problemSearch = new ProblemWebView();
problemSearch.setArguments(bundle);
fragmentName = problemSearch;
break;
case 6:
fragmentName = rankList;
break;
case 7:
fragmentName = liveSubmissions;
break;
case 8:
Bundle bundles = new Bundle();
bundles.putInt("problem_no", problemNo);
problemStatistics = new ProblemStatistics();
problemStatistics.setArguments(bundles);
fragmentName = problemStatistics;
default:
break;
}
backStateName = fragmentName.getClass().getName();
fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped) {
ft.replace(R.id.content_frame, fragmentName);
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(backStateName);
ft.commit();
// I am using drawer layout
mDrawerList.setItemChecked(position, true);
setTitle(title[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
সমস্যাটি হ'ল, যখন আমি চালু করি A
এবং তারপরে B
, তারপরে 'পিছনে' টিপুন, B
সরানো হবে এবং A
আবার চালু করা হবে। এবং দ্বিতীয়বার 'পিছনে' টিপলে অ্যাপটি প্রস্থান করা উচিত। তবে এটি একটি ফাঁকা উইন্ডো দেখাচ্ছে এবং এটি বন্ধ করার জন্য আমাকে তৃতীয়বার ফিরে যেতে হবে।
এছাড়াও, যখন আমি চালু করি A
, তখন B
, তারপরে C
, তারপরে B
আবার ...
প্রত্যাশিত:
| |
| |
|B|
|A|
___
আসল:
| |
|B|
|B|
|A|
___
আমার onBackPressed()
কোনও কাস্টমাইজেশন নিয়ে ওভাররাইড করা উচিত বা আমি কিছু মিস করছি?