Tôi đang học cách sử dụng các mảnh vỡ. Tôi có ba trường hợp Fragment
được khởi tạo ở đầu lớp. Tôi đang thêm đoạn vào một hoạt động như thế này:
Khai báo và khởi tạo:
Fragment A = new AFragment();
Fragment B = new BFragment();
Fragment C = new CFragment();
Thay thế / Thêm:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, A);
ft.addToBackStack(null);
ft.commit();
Những đoạn này đang hoạt động đúng. Mỗi phân đoạn được gắn vào hoạt động và được lưu vào ngăn xếp phía sau mà không gặp vấn đề gì.
Vì vậy, khi tôi khởi chạy A
, C
và sau đó B
, ngăn xếp trông như thế này:
| |
|B|
|C|
|A|
___
Và khi tôi nhấn nút 'quay lại', B
bị hủy và C
được nối lại.
Nhưng, khi tôi khởi chạy đoạn A
thứ hai, thay vì tiếp tục từ ngăn xếp trở lại, nó được thêm vào ở đầu ngăn xếp phía sau
| |
|A|
|C|
|A|
___
Nhưng tôi muốn tiếp tục A
và phá hủy tất cả các mảnh vỡ trên nó (nếu có). Trên thực tế, tôi chỉ thích hành vi ngăn xếp trở lại mặc định.
Làm thế nào để tôi thực hiện điều này?
Dự kiến: ( A
nên được nối lại và các mảnh vỡ trên cùng sẽ bị phá hủy)
| |
| |
| |
|A|
___
Chỉnh sửa: (được đề xuất bởi A - C)
Đây là mã cố gắng của tôi:
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);
}
Vấn đề là, khi tôi khởi chạy A
và sau B
đó nhấn 'trở lại', B
sẽ bị xóa và A
được tiếp tục. và nhấn 'trở lại' lần thứ hai sẽ thoát khỏi ứng dụng. Nhưng nó đang hiển thị một cửa sổ trống và tôi phải nhấn lại lần thứ ba để đóng nó.
Ngoài ra, khi tôi khởi chạy A
, sau đó B
, sau đó C
, B
một lần nữa ...
Hy vọng:
| |
| |
|B|
|A|
___
Thực tế:
| |
|B|
|B|
|A|
___
Tôi nên ghi đè onBackPressed()
với bất kỳ tùy chỉnh hoặc tôi đang thiếu một cái gì đó?