Saya belajar cara menggunakan fragmen. Saya memiliki tiga contoh Fragment
yang diinisialisasi di bagian atas kelas. Saya menambahkan fragmen ke aktivitas seperti ini:
Mendeklarasikan dan menginisialisasi:
Fragment A = new AFragment();
Fragment B = new BFragment();
Fragment C = new CFragment();
Mengganti / menambahkan:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, A);
ft.addToBackStack(null);
ft.commit();
Cuplikan ini berfungsi dengan baik. Setiap fragmen melekat pada aktivitas, dan disimpan ke tumpukan belakang tanpa masalah.
Jadi ketika saya meluncurkan A
,, C
dan kemudian B
, tumpukan terlihat seperti ini:
| |
|B|
|C|
|A|
___
Dan ketika saya menekan tombol 'kembali', B
dihancurkan dan C
dilanjutkan.
Tetapi, ketika saya meluncurkan fragmen A
untuk kedua kalinya, alih-alih melanjutkan dari tumpukan belakang, itu ditambahkan di bagian atas tumpukan belakang
| |
|A|
|C|
|A|
___
Tetapi saya ingin melanjutkan A
dan menghancurkan semua fragmen di atasnya (jika ada). Sebenarnya, saya hanya suka perilaku back-stack standar.
Bagaimana saya mencapai ini?
Diharapkan: ( A
harus dilanjutkan dan fragmen atas harus dihancurkan)
| |
| |
| |
|A|
___
Edit: (disarankan oleh A - C)
Ini adalah kode percobaan saya:
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);
}
Masalahnya adalah, ketika saya meluncurkan A
dan kemudian B
, kemudian tekan 'kembali', B
dihapus dan A
dilanjutkan. dan menekan 'kembali' untuk kedua kalinya harus keluar dari aplikasi. Tapi itu menunjukkan jendela kosong dan saya harus menekan kembali untuk ketiga kalinya untuk menutupnya.
Juga, ketika saya meluncurkan A
, lalu B
, lalu C
, sekali B
lagi ...
Diharapkan:
| |
| |
|B|
|A|
___
Sebenarnya:
| |
|B|
|B|
|A|
___
Haruskah saya mengganti onBackPressed()
dengan kustomisasi atau saya kehilangan sesuatu?