ฉันกำลังเรียนรู้วิธีใช้ชิ้นส่วนต่างๆ ฉันมีสามกรณีของการ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()
ด้วยการปรับแต่งใด ๆ หรือฉันขาดอะไร