मैं टुकड़ों का उपयोग करना सीख रहा हूं। मेरे पास इसके तीन उदाहरण हैं 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|
___
संपादित करें: (A - C द्वारा सुझाया गया)
यह मेरा प्रयास कोड है:
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()
किसी अनुकूलन के साथ ओवरराइड करना चाहिए या मुझे कुछ याद आ रहा है?