Saya belajar cara menggunakan fragmen. Saya memiliki tiga contoh Fragmentyang 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,, Cdan kemudian B, tumpukan terlihat seperti ini:
| |
|B|
|C|
|A|
___
Dan ketika saya menekan tombol 'kembali', Bdihancurkan dan Cdilanjutkan.
Tetapi, ketika saya meluncurkan fragmen Auntuk kedua kalinya, alih-alih melanjutkan dari tumpukan belakang, itu ditambahkan di bagian atas tumpukan belakang
| |
|A|
|C|
|A|
___
Tetapi saya ingin melanjutkan Adan menghancurkan semua fragmen di atasnya (jika ada). Sebenarnya, saya hanya suka perilaku back-stack standar.
Bagaimana saya mencapai ini?
Diharapkan: ( Aharus 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 Adan kemudian B, kemudian tekan 'kembali', Bdihapus dan Adilanjutkan. 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 Blagi ...
Diharapkan:
| |
| |
|B|
|A|
___
Sebenarnya:
| |
|B|
|B|
|A|
___
Haruskah saya mengganti onBackPressed()dengan kustomisasi atau saya kehilangan sesuatu?