Saat menggunakan Navigasi Drawer, pengembang Android merekomendasikan bahwa di ActionBar "hanya layar yang diwakili dalam Navigasi Drawer yang benar-benar harus memiliki gambar Navigasi Drawer" dan bahwa "semua layar lain memiliki karat tradisional."
Lihat di sini untuk perincian: http://youtu.be/F5COhlbpIbY
Saya menggunakan satu aktivitas untuk mengontrol beberapa level fragmen dan dapat menampilkan gambar Drawer Navigasi untuk ditampilkan dan berfungsi di semua level.
Saat membuat fragmen level yang lebih rendah, saya dapat memanggil ActionBarDrawerToggle
setDrawerIndicatorEnabled(false)
untuk menyembunyikan gambar Laci Navigasi dan menampilkan tanda Up
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag, "lowerFrag").addToBackStack(null).commit();
Masalah yang saya alami adalah ketika saya menavigasi kembali ke fragmen tingkat atas yang masih ditampilkan oleh Karat Atas alih-alih gambar Navigasi Laci asli. Adakah saran tentang cara "menyegarkan" ActionBar pada fragmen tingkat atas untuk menampilkan kembali gambar Laci Navigasi?
Larutan
Saran Tom bekerja untukku. Inilah yang saya lakukan:
Aktifitas utama
Aktivitas ini mengontrol semua fragmen dalam aplikasi.
Saat menyiapkan fragmen baru untuk menggantikan yang lain, saya mengatur DrawerToggle setDrawerIndicatorEnabled(false)
seperti ini:
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag).addToBackStack(null).commit();
Selanjutnya, onBackPressed
sebagai ganti, saya mengembalikan yang di atas dengan mengatur DrawerToggle setDrawerIndicatorEnabled(true)
seperti ini:
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
Di LowerLevelFragments
Dalam fragmen yang saya modifikasi onCreate
dan onOptionsItemSelected
seperti ini:
Dalam onCreate
ditambahkan setHasOptionsMenu(true)
untuk mengaktifkan konfigurasi menu opsi. Juga atur setDisplayHomeAsUpEnabled(true)
untuk mengaktifkan < di bilah tindakan:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// needed to indicate that the fragment would
// like to add items to the Options Menu
setHasOptionsMenu(true);
// update the actionbar to show the up carat/affordance
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}
Kemudian onOptionsItemSelected
setiap kali < ditekan, panggilan onBackPressed()
dari aktivitas untuk naik satu tingkat dalam hierarki dan menampilkan Navigasi Drawer Image:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Get item selected and deal with it
switch (item.getItemId()) {
case android.R.id.home:
//called when the up affordance/carat in actionbar is pressed
getActivity().onBackPressed();
return true;
…
}
.replace(R.id.frag_layout
. Jika ini adalah satu tingkat hirarki lagi saya harapkan Anda.add
ke backstack.theDrawerToggle.setDrawerIndicatorEnabled(false);
dalam fragmen? Saya pikir itu dideklarasikan di file kelas Kegiatan Utama. Saya tidak dapat menemukan cara untuk referensi ini. Ada petunjuk?setDisplayOptions()
metode di dalamToolbarWidgetWrapper
(dari paket android.support.v7.internal.widget internal) tidak akan membuat ulang ikon saat memasukkan fragmen yang sama untuk kedua kalinya. Hanya meninggalkan ini di sini ketika orang lain menemukan masalah ini juga.Jawaban:
Anda telah menulis bahwa, untuk mengimplementasikan fragmen level lebih rendah, Anda mengganti fragmen yang ada, sebagai lawan mengimplementasikan fragmen level bawah dalam aktivitas baru.
Saya akan berpikir bahwa Anda kemudian harus mengimplementasikan fungsionalitas kembali secara manual: ketika pengguna menekan kembali Anda memiliki kode yang muncul stack (misalnya dalam
Activity::onBackPressed
menimpa). Jadi, di mana pun Anda melakukannya, Anda dapat membalikkannyasetDrawerIndicatorEnabled
.sumber
Semudah 1-2-3.
Jika Anda ingin mencapai:
1) Indikator Laci - ketika tidak ada pecahan di Back Stack atau Drawer dibuka
2) Panah - ketika beberapa Fragmen berada di Back Stack
3) Kedua indikator bertindak sesuai dengan bentuknya
PS Lihat Membuat Laci Navigasi di Android Pengembang tentang tips lain tentang perilaku indikator 3-baris.
sumber
setActionBarArrowDependingOnFragmentsBackStack()
... nama yang panjang: PSaya telah menggunakan hal berikutnya:
sumber
drawerToggle.setToolbarNavigationClickListener(
pendengar ini dipanggil saat mengklik panahJika tombol bilah tindakan atas Anda tidak berfungsi, jangan lupa menambahkan pendengar:
Saya mengalami kesulitan menerapkan navigasi laci dengan tombol beranda, semuanya berfungsi kecuali tombol aksi.
sumber
Cobalah menangani pemilihan item Beranda di MainActivity tergantung pada status DrawerToggle. Dengan cara ini Anda tidak perlu menambahkan kode yang sama ke setiap fragmen.
sumber
onBackPressed()
karena saya ingin perilaku yang sama untuk keduanya.MENGIKUTI
Solusi yang diberikan oleh @dzeikei rapi, tetapi dapat diperpanjang, ketika menggunakan fragmen, untuk secara otomatis menangani pengaturan kembali indikator laci ketika backstack kosong.
EDIT
Untuk pertanyaan @JJD.
Fragmen-fragmen tersebut disimpan / dikelola dalam suatu kegiatan. Kode di atas ditulis sekali dalam aktivitas itu, tetapi hanya menangani tanda sisipan untuk
onOptionsItemSelected
.Di salah satu aplikasi saya, saya juga perlu menangani perilaku sisir atas ketika tombol kembali ditekan. Ini bisa ditangani dengan mengesampingkan
onBackPressed
.Perhatikan duplikasi kode antara
onOptionsItemSelected
danonBackPressed
yang dapat dihindari dengan membuat metode dan memanggil metode itu di kedua tempat.Juga perhatikan saya menambahkan dua kali lagi
executePendingTransactions
yang dalam kasus saya diperlukan atau kalau tidak saya kadang-kadang memiliki perilaku aneh dari sisir atas.sumber
mDrawerToggle
dalamNavigationDrawerFragment
kelas. Untuk membuatnya bekerja saya harus juga beralih keadaan tombol home / indikator - lihat:NavigationDrawerFragment#toggleDrawerIndicator
. Lebih lanjut, saya tidak yakin Anda perlu check in awalonOptionsItemSelected
: Saya membatalkan komentar itu. - Contoh sederhanaonOptionsItemSelected
. Ini memastikan bahwa Navigasi Drawer masih terbuka di hierarki tingkat atas. Namun, saya memindahkan kode keNavigationDrawerFragment#onOptionsItemSelected
. Ini membantu saya untuk tidak mengeksposmDrawerToggle
keMainActivity
.Saya membuat antarmuka untuk aktivitas hosting untuk memperbarui status tampilan menu hamburger. Untuk fragmen tingkat atas, saya mengatur sakelar ke
true
dan untuk fragmen yang ingin saya tampilkan panah <saya menyetel sakelar kefalse
.Kemudian di Aktivitas saya ...
sumber
Ini jawaban bekerja tapi ada sedikit masalah dengan itu. Itu
getSupportActionBar().setDisplayHomeAsUpEnabled(false)
tidak dipanggil secara eksplisit dan itu menyebabkan ikon laci disembunyikan bahkan ketika tidak ada item di backstack sehingga mengubahsetActionBarArrowDependingOnFragmentsBackStack()
metode ini bekerja untuk saya.sumber
Logikanya jelas. Tampilkan tombol kembali jika tumpukan back fragment jelas. Perlihatkan animasi materi hamburger-kembali jika tumpukan fragmen tidak jelas.
sumber
Jika Anda melihat aplikasi GMAIL dan datang ke sini untuk mencari ikon carret / keterjangkauan ..
Saya akan meminta Anda untuk melakukan ini, tidak ada jawaban di atas yang jelas. saya dapat mengubah jawaban yang diterima.
NavigationDrawer -> Listview berisi subfragmen.
subfragmen akan terdaftar seperti ini
firstFragment == posisi 0 ---> ini akan memiliki subfragmen -> fragmen
Di firstFragment Anda memiliki fragmen lain.
Sebut ini di DrawerActivity
dan dalam fragmen
Pada metode aktivitas Drawer pada OnBackPress mengatur drawer toggle ke true untuk mengaktifkan kembali ikon daftar navigasi.
Terima kasih, Pusp
sumber
Anda dapat melihat contoh kecil ini! https://github.com/oskarko/NavDrawerExample
sumber
IMO, menggunakan onNavigateUp () (seperti yang ditunjukkan di sini ) dalam solusi riwnodennyk atau Tom lebih bersih dan tampaknya bekerja lebih baik. Cukup ganti kode onOptionsItemSelected dengan ini:
sumber