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?
sumber
OnBackstackChangedListener
sehingga Anda dapat menjamin bahwa Anda berurusan dengan Fragmen yang tepat.OnBackstackChangedListener
juga.instanceof
:)A-B-C-B
dan tekan kembali satu kali Anda akan kembali keA
dan tidak kembali keC
. Itu karenapopBackStackImmediate
tidak hanya muncul tag yang diberikan tetapi juga segala sesuatu di atas. Apakah ada pekerjaan di sana?Saya pikir metode ini memecahkan masalah Anda:
yang semula diposting di Pertanyaan Ini
sumber
Langkah 1: Terapkan antarmuka dengan kelas aktivitas Anda
Langkah 2: Saat Anda memanggil fragmen lain, tambahkan metode ini:
sumber
sumber
sumber
Solusi yang lebih mudah akan mengubah baris ini
ft.replace(R.id.content_frame, A);
untukft.add(R.id.content_frame, A);
Dan di dalam tata letak XML Anda, silakan gunakan
Clickable
artinya dapat diklik oleh perangkat penunjuk atau disadap oleh perangkat sentuh.Focusable
berarti dapat memperoleh fokus dari perangkat input seperti keyboard. Perangkat input seperti keyboard tidak dapat memutuskan tampilan mana yang akan dikirimi aktivitas input berdasarkan input itu sendiri, sehingga mereka mengirimnya ke tampilan yang memiliki fokus.sumber