Saya membuat laci navigasi yang berfungsi seperti yang ditunjukkan pada tutorial di situs web developer.android.com . Tapi sekarang, saya ingin menggunakan satu Navigasi Drawer, saya buat di NavigationDrawer.class untuk beberapa Kegiatan di Aplikasi saya.
Pertanyaan saya adalah, jika ada orang di sini dapat membuat sedikit Tutorial, yang menjelaskan, bagaimana cara menggunakan satu laci Navigasi untuk beberapa Kegiatan.
Saya membacanya pertama kali di Jawaban ini Laci Navigasi Android pada beberapa Kegiatan
tetapi itu tidak berhasil pada Proyek saya
public class NavigationDrawer extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
private ActionBarDrawerToggle drawerToggle;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout, R.drawable.ic_drawer, 0, 0) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(R.string.app_name);
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(R.string.menu);
}
};
drawerLayout.setDrawerListener(drawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
layers = getResources().getStringArray(R.array.layers_array);
drawerList = (ListView) findViewById(R.id.left_drawer);
View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
drawerList.addHeaderView(header, null, false);
drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text1,
layers));
View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
R.layout.drawer_list_footer, null, false);
drawerList.addFooterView(footerView);
drawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
map.drawerClickEvent(pos);
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}
}
Dalam Kegiatan ini saya ingin memiliki Navigasi Drawer jadi saya memperluas 'NavigationDrawer' dan dalam beberapa Kegiatan lain saya ingin Pengguna laci Navigasi yang Sama
public class SampleActivity extends NavigationDrawer {...}
Saya tidak tahu harus berubah apa ...
Jawaban:
Jika Anda ingin laci navigasi, Anda harus menggunakan fragmen. Saya mengikuti tutorial ini minggu lalu dan ini berhasil:
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Anda juga dapat mengunduh kode sampel dari tutorial ini, untuk melihat bagaimana Anda dapat melakukan ini.
Tanpa fragmen:
Ini adalah Kode BaseActivity Anda:
Semua Kegiatan lain yang perlu memiliki laci navigasi harus memperluas Kegiatan ini, bukan Kegiatan itu sendiri, contoh:
XML
Edit:
Saya mengalami beberapa kesulitan sendiri, jadi di sini adalah solusi jika Anda mendapatkan NullPointerExceptions. Di BaseActivity ubah fungsi onCreate menjadi
protected void onCreateDrawer()
. Sisanya bisa tetap sama. Dalam Aktivitas yang memperluas BaseActivity masukkan kode dalam urutan ini:Ini membantu saya memperbaiki masalah saya, semoga membantu!
Ini adalah bagaimana Anda dapat membuat laci navigasi dengan banyak aktivitas, jika Anda memiliki pertanyaan, jangan ragu untuk bertanya.
Edit 2:
Seperti yang dikatakan oleh @GregDan Anda
BaseActivity
juga dapat menggantisetContentView()
dan memanggil onCreateDrawer di sana:sumber
Saya telah menemukan implementasi terbaik. Ada di aplikasi Google I / O 2014 .
Mereka menggunakan pendekatan yang sama dengan Kevin. Jika Anda dapat mengambil sendiri dari semua hal yang tidak dibutuhkan dalam aplikasi I / O, Anda dapat mengekstraksi semua yang Anda butuhkan dan dijamin oleh Google bahwa ini adalah penggunaan pola laci navigasi yang benar. Setiap aktivitas secara opsional memiliki
DrawerLayout
tata letak utama. Bagian yang menarik adalah bagaimana navigasi ke layar lain dilakukan. DiimplementasikanBaseActivity
seperti ini:Ini berbeda dari cara umum mengganti fragmen saat ini dengan transaksi fragmen. Tetapi pengguna tidak melihat perbedaan visual.
sumber
overridePendingTransitions
.Jadi jawaban ini terlambat beberapa tahun tetapi seseorang mungkin menghargainya. Android telah memberi kami widget baru yang mempermudah penggunaan satu laci navigasi dengan beberapa kegiatan lebih mudah.
android.support.design.widget.NavigationView adalah modular dan memiliki tata letak sendiri di folder menu. Cara Anda menggunakannya adalah untuk membungkus tata letak xml dengan cara berikut:
Root Layout adalah android.support.v4.widget.DrawerLayout yang berisi dua anak:
<include ... />
tata letak yang sedang dibungkus (lihat 2) dan android.support.design.widget.NavigationView.nav_header_main hanyalah LinearLayout dengan orientasi = vertikal untuk header Drawar Navigasi Anda.
activity_main_drawer adalah menu xml di direktori res / menu Anda. Ini dapat berisi item dan grup pilihan Anda. Jika Anda menggunakan Galeri AndroidStudio, wizard akan membuat yang dasar untuk Anda dan Anda dapat melihat apa pilihan Anda.
Tata letak bilah aplikasi biasanya sekarang menjadi android.support.design.widget.CoordinatorLayout dan ini akan mencakup dua anak: android.support.design.widget.AppBarLayout (yang berisi android.support.v7.widget.Toolbar), dan
<include ... >
untuk konten Anda yang sebenarnya (lihat 3).Tata letak konten dapat berupa tata letak apa pun yang Anda inginkan. Ini adalah tata letak yang berisi konten utama aktivitas (tidak termasuk laci navigasi atau bilah aplikasi).
Sekarang, hal paling keren tentang semua ini adalah Anda dapat membungkus setiap aktivitas dalam dua tata letak ini tetapi memiliki NavigationView Anda (lihat langkah 1) selalu arahkan ke activity_main_drawer (atau apa pun). Ini berarti bahwa Anda akan memiliki Laci Navigasi yang sama (*) pada semua aktivitas.
sumber
Cara termudah untuk menggunakan kembali laci Navigasi yang umum di antara sekelompok kegiatan
app_base_layout.xml
AppBaseActivity.java
sumber
AppBaseActivity
dansetContentView
cara standarnya akan berfungsi.Untuk orang lain yang ingin melakukan apa yang diminta poster asli, harap pertimbangkan untuk menggunakan fragmen sebagai ganti cara Kevin mengatakan. Berikut ini adalah tutorial yang sangat baik tentang cara melakukannya:
https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer
Jika Anda memilih untuk menggunakan aktivitas alih-alih fragmen, Anda akan mengalami masalah laci nav yang dibuat ulang setiap kali Anda menavigasi ke aktivitas baru. Ini menghasilkan rendering nav yang jelek / lambat setiap kali.
sumber
Saran saya adalah: jangan gunakan aktivitas sama sekali, sebaliknya gunakan fragmen, dan ganti mereka dalam wadah (Linear Layout misalnya) tempat Anda menunjukkan fragmen pertama Anda.
Kode tersedia di Tutorial Pengembang Android, Anda hanya perlu menyesuaikan.
http://developer.android.com/training/implementing-navigation/nav-drawer.html
Dianjurkan agar Anda harus menggunakan lebih banyak dan lebih banyak fragmen dalam aplikasi Anda, dan seharusnya hanya ada empat kegiatan dasar lokal untuk aplikasi Anda, yang Anda sebutkan di AndroidManifest.xml Anda terpisah dari yang eksternal (FacebookActivity misalnya):
SplashActivity: tidak menggunakan fragmen, dan menggunakan tema Layar Penuh.
LoginSignUpActivity: Tidak memerlukan NavigationDrawer sama sekali, dan tidak ada tombol kembali juga, jadi cukup gunakan toolbar normal, tetapi setidaknya, 3 atau 4 fragmen akan diperlukan. Menggunakan tema tanpa-tindakan-bilah
BerandaAktivitas atau Aktivitas DashBoard: Menggunakan tema no-action-bar. Di sini Anda memerlukan laci Navigasi, juga semua layar yang mengikuti akan menjadi fragmen atau fragmen bersarang, hingga tampilan daun, dengan laci bersama. Semua pengaturan, profil pengguna, dll. Akan ada di sini sebagai fragmen, dalam aktivitas ini. Fragmen di sini tidak akan ditambahkan ke tumpukan belakang dan akan dibuka dari item menu laci. Dalam hal fragmen yang membutuhkan tombol kembali dan bukan laci, ada jenis aktivitas keempat di bawah ini.
Aktivitas tanpa laci. Aktivitas ini memiliki tombol kembali di atas dan fragmen di dalamnya akan berbagi bilah tindakan yang sama. Fragmen-fragmen ini akan ditambahkan ke tumpukan-belakang, karena akan ada riwayat navigasi.
[Untuk panduan lebih lanjut, lihat: https://stackoverflow.com/a/51100507/787399 ]
Selamat Coding !!
sumber
perbarui kode ini dalam aktivitas dasar. dan jangan lupa untuk memasukkan drawer_list_header dalam aktivitas Anda xml.
dan jangan gunakan permintaan () dalam aktivitas Anda. tapi laci masih tidak terlihat saat mengklik gambar..dan dengan menyeretnya akan terlihat tanpa daftar item. Saya sudah mencoba banyak tetapi tidak berhasil. butuh latihan untuk ini ...
sumber
Dengan jawaban @Kevin van Mierlo, Anda juga dapat menerapkan beberapa laci. Misalnya, menu default terletak di sisi kiri (mulai), dan menu opsional lebih lanjut, yang terletak di sisi kanan, yang hanya ditampilkan ketika fragmen determinasi dimuat.
Saya sudah bisa melakukan itu.
sumber
gunakan ini untuk toolbar.xml Anda
gunakan ini untuk tajuk navigasi jika ingin digunakan
sumber
Saya melakukannya di Kotlin seperti ini:
Aktivitas untuk laci harus mewarisi ini
BaseAppCompatActivity
, panggilansuper.onCreate
setelah konten diatur (sebenarnya, dapat dipindahkan ke beberapa metode init) dan memiliki elemen yang sesuai untuk id dalam tata letak merekasumber
Jawaban saya hanyalah jawaban konseptual tanpa kode sumber. Mungkin bermanfaat bagi sebagian pembaca seperti saya untuk memahaminya.
Itu tergantung pada pendekatan awal Anda tentang bagaimana Anda membuat arsitektur aplikasi Anda. Pada dasarnya ada dua pendekatan.
Anda membuat satu aktivitas (aktivitas dasar) dan semua tampilan dan layar lainnya akan menjadi fragmen. Aktivitas dasar itu berisi implementasi untuk Layer dan Coordinator Layouts. Ini sebenarnya adalah cara yang saya sukai karena memiliki fragmen-fragmen mandiri yang kecil akan membuat pengembangan aplikasi lebih mudah dan lebih lancar.
Jika Anda telah memulai pengembangan aplikasi Anda dengan aktivitas, satu untuk setiap layar, maka Anda mungkin akan membuat aktivitas dasar, dan semua aktivitas lain meluas darinya. Aktivitas dasar akan berisi kode untuk implementasi laci dan koordinator. Setiap aktivitas yang membutuhkan implementasi laci dapat diperluas dari aktivitas dasar.
Saya pribadi lebih suka menghindari menggunakan fragmen dan aktivitas yang dicampur tanpa pengorganisasian. Itu membuat pengembangan lebih sulit dan membuat Anda macet pada akhirnya. Jika Anda telah melakukannya, perbaiki kode Anda.
sumber
Buat laci Navigasi di MainActivity Anda menggunakan fragmen.
Inisialisasi Laci Navigasi di MainActivity
sekarang di semua aktivitas lain yang ingin Anda gunakan Laci Navigasi yang sama, tempatkan DrawerLayout sebagai basis dan pilah sebagai laci navigasi. Cukup atur android: name pada fragmen Anda yang menunjuk ke file Java fragmen Anda. Anda tidak perlu menginisialisasi fragmen di Aktivitas lain.
Anda dapat mengakses Nav Drawer dengan menggesekkan aktivitas lain seperti di aplikasi Google Play Store
sumber