Implementasi BottomAppBar. Bagian 3: Perilaku untuk Android

Implementasi BottomAppBar. Bagian 3: Perilaku untuk Android


BottomAppBar adalah salah satu komponen Android Material baru yang diperkenalkan di Google I / O 2018 . Dengan menggerakkan Navigasi Laci dan menu aplikasi ke bagian bawah layar, BottomAppBar secara radikal mengubah tampilan aplikasi Android.


Di bagian pertama dan kedua dari seri artikel kami tentang BottomAppBar, kami bertemu dengan BottomAppBar dan mendiskusikan atributnya. Kami juga menjelaskan cara menerapkan Navigasi Drawer dan menu aplikasi di dalam BottomAppBar.


Perilaku


Menurut Desain Material, komponen aplikasi tidak statis. Mereka dapat bergerak atau mengubah, yaitu untuk memiliki semacam perilaku. Desain Material juga membentuk kerangka kerja untuk perilaku ini. Pada artikel ini, kita akan membahas detail implementasi dari perilaku yang direkomendasikan untuk BottomAppBar, yang disajikan pada halaman pedoman untuk BottomAppBar .


Tata letak


Pedoman pertama menjelaskan tata letak BottomAppBar. Inilah yang disarankan :


Untuk layar aplikasi dengan makna berbeda, Anda dapat mengubah tata letak dan set item menu di BottomAppBar. Misalnya, Anda dapat menampilkan item menu lebih banyak atau lebih sedikit tergantung pada apa yang paling cocok untuk layar tertentu.

Tata letak pedoman


Berdasarkan pedoman ini, Anda disarankan untuk menggunakan tata letak BottomAppBar di layar utama , menampilkan beberapa item menu dan FAB terpusat (Tombol Aksi Melayang). Pada layar sekunder , transisi yang dilakukan dari yang utama, tata letak BottomAppBar harus terdiri dari FAB yang lurus dan beberapa item menu tambahan. Transisi antara kedua layar ini harus dilakukan dengan benar. Gif di atas menunjukkan pedoman ini.


Sekarang mari kita lihat bagaimana perilaku ini dapat diimplementasikan. Kami memiliki dua file xml di folder res/menu untuk menu setiap layar:


 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/app_bar_search" android:icon="@drawable/baseline_search_white_24" android:title="@string/action_search" app:showAsAction="ifRoom"/> </menu> 

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/app_bar_mail" android:icon="@drawable/baseline_mail_white_24" android:title="@string/action_mail" app:showAsAction="ifRoom"/> <item android:id="@+id/app_bar_delete" android:icon="@drawable/baseline_delete_white_24" android:title="@string/action_delete" app:showAsAction="ifRoom"/> <item android:id="@+id/app_bar_archieve" android:icon="@drawable/baseline_archive_white_24" android:title="@string/action_archieve" app:showAsAction="ifRoom"/> </menu> 

Ketika ada transisi antar layar, misalnya, dengan menekan tombol TOGGLE SCREEN dalam kasus kami, tata letak BottomAppBar, termasuk menu dan FAB, akan berubah. Berikut adalah kode dasar untuk perilaku tata letak BottomAppBar ini:


 // Hide navigation drawer icon bottom_app_bar.navigationIcon = null // Move FAB from the center of BottomAppBar to the end of it bottom_app_bar.fabAlignmentMode = BottomAppBar.FAB_ALIGNMENT_MODE_END // Replace the action menu bottom_app_bar.replaceMenu(bottomappbar_menu_secondary) // Change FAB icon fab?.setImageDrawable(baseline_reply_white_24) 

Jika Anda ingin membuat transisi animasi, Anda memerlukan kode tambahan. Anda dapat mempelajari kode sumber yang dilampirkan di akhir artikel ini di mana Anda akan menemukan animasi.


Bergulir


Menggulir adalah pemicu perilaku penting untuk komponen seperti BottomAppBar. Pada halaman pedoman Desain Material, perilaku berikut ini direkomendasikan untuk kasus ini:


Saat menggulir, BottomAppBar dapat muncul atau menghilang:
- Scrolling ke bawah menyembunyikan BottomAppBar. Jika memiliki FAB, itu terputus dari panel dan tetap di layar.
- Menggulir ke atas menunjukkan BottomAppBar dan memasang kembali ke FAB jika ada di sana.

Berikut ini adalah demonstrasi perilaku BottomAppBar saat menggulir.


Scrolling dan BottomAppBar


Untuk menggunakan perilaku ini, BottomAppBar dan FAB harus merupakan anak langsung dari CoordinatorLayout . Kemudian kami mengaktifkan hideOnScroll dan mengatur bendera gulir untuk BottomAppBar:


 <com.google.android.material.bottomappbar.BottomAppBar android:id="@+id/bottom_app_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" app:fabAlignmentMode="center" app:hideOnScroll="true" app:layout_scrollFlags="scroll|enterAlways"/> 

Ini cukup untuk menerapkan perilaku BottomAppBar ini.


Ketinggian


Setiap komponen dalam dunia Desain Material memiliki ketinggian yang mirip dengan dunia fisik kita. Di BottomAppBar, ketinggiannya 8dp , dan konten layarnya naik menjadi 0dp . FAB dalam keadaan statis naik 12dp . Dua komponen yang akan kita ingat dalam artikel ini, Navigasi Drawer dan Snackbar, masing-masing naik 16dp dan 6dp .


Biasanya, Snackbar adalah komponen untuk memberi tahu pengguna yang muncul dari bagian bawah layar. Tetapi jika ada BottomAppBar atau Navigasi Drawer di layar, perilaku Snackbar harus berubah. Dalam kasus ini, Snackbar harus ditampilkan di atas komponen yang lebih rendah. Berikut ini adalah demo dan kode terkait untuk diterapkan:


Snackbar dan BottomAppBar


 private fun displayMaterialSnackBar() { val marginSide = 0 val marginBottom = 550 val snackbar = Snackbar.make( coordinatorLayout2, "FAB Clicked", Snackbar.LENGTH_LONG ).setAction("UNDO") { } // Changing message text color snackbar.setActionTextColor(ContextCompat.getColor(this, R.color.colorSnackbarButton)) val snackbarView = snackbar.view val params = snackbarView.layoutParams as CoordinatorLayout.LayoutParams params.setMargins( params.leftMargin + marginSide, params.topMargin, params.rightMargin + marginSide, params.bottomMargin + marginBottom ) snackbarView.layoutParams = params snackbar.show() } 

Seperti yang telah kami sebutkan, Navigasi Drawer naik 16dp , yang berarti - sesuai dengan pedoman -


Menu yang keluar dari BottomAppBar (mis. Navigasi Drawer) terbuka sebagai modal windows satu tingkat lebih tinggi dari BottomAppBar itu sendiri.

Berikut ini adalah penerapan Laci Navigasi kami:


Perilaku Laci Navigasi


Navigasi Drawer adalah jendela modal dan karenanya mengikuti aturan implementasi di atas.


Rincian penerapan perilaku ini adalah sebagai berikut. Di folder res/menu , file menu xml untuk Tampilan Navigasi harus dibuat, yang akan digunakan di Drawer Navigasi:


 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <group android:checkableBehavior="none"> <item android:id="@+id/nav1" android:icon="@drawable/baseline_mail_white_24" android:title="@string/nav_item1" /> <item android:id="@+id/nav2" android:icon="@drawable/baseline_bookmark_white_24" android:title="@string/nav_item2" /> <item android:id="@+id/nav3" android:icon="@drawable/baseline_message_white_24" android:title="@string/nav_item3" /> <item android:id="@+id/nav4" android:icon="@drawable/baseline_note_white_24" android:title="@string/nav_item4" /> <item android:id="@+id/nav5" android:icon="@drawable/baseline_location_on_white_24" android:title="@string/nav_item5" /> <item android:id="@+id/nav6" android:icon="@drawable/baseline_sync_white_24" android:title="@string/nav_item6" /> <item android:id="@+id/nav7" android:icon="@drawable/baseline_cloud_upload_white_24" android:title="@string/nav_item7" /> <item android:id="@+id/nav8" android:icon="@drawable/baseline_favorite_white_24" android:title="@string/nav_item8" /> <item android:id="@+id/nav9" android:icon="@drawable/baseline_chrome_reader_mode_white_24" android:title="@string/nav_item9" /> <item android:id="@+id/nav10" android:icon="@drawable/baseline_select_all_white_24" android:title="@string/nav_item10" /> <item android:id="@+id/nav11" android:icon="@drawable/baseline_sort_white_24" android:title="@string/nav_item11" /> <item android:id="@+id/nav12" android:icon="@drawable/baseline_access_time_white_24" android:title="@string/nav_item12" /> <item android:id="@+id/nav13" android:icon="@drawable/baseline_data_usage_white_24" android:title="@string/nav_item13" /> </group> </menu> 

Maka file tata letak harus dibuat untuk fragmen menggunakan Navigasi Drawer:


 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/navigation_view_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:behavior_hideable="true" app:layout_behavior="@string/bottom_sheet_behavior"> <com.google.android.material.navigation.NavigationView android:id="@+id/navigation_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_marginTop="4dp" android:paddingBottom="40dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/view2" app:menu="@menu/bottom_nav_drawer_menu" app:theme="@style/NavigationDrawerStyle" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="12dp" android:layout_marginTop="16dp" android:fontFamily="@font/rubik_medium" android:text="@string/bottom_sheet_name" android:textColor="@color/colorAccent" android:textSize="18sp" android:textStyle="bold" app:layout_constraintStart_toEndOf="@+id/imageView" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:text="@string/bottom_sheet_email" android:textColor="@color/colorAccent" app:layout_constraintStart_toStartOf="@+id/textView" app:layout_constraintTop_toBottomOf="@+id/textView" /> <ImageView android:id="@+id/imageView" android:layout_width="48dp" android:layout_height="48dp" android:layout_marginStart="24dp" android:background="@drawable/baseline_account_circle_black_48" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/textView" /> <View android:id="@+id/view2" android:layout_width="match_parent" android:layout_height="2dip" android:layout_marginTop="15dp" android:background="#447e7e7e" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView2" /> <ImageView android:id="@+id/close_imageview" android:layout_width="24dp" android:layout_height="24dp" android:layout_marginTop="8dp" android:layout_marginEnd="16dp" android:layout_marginBottom="8dp" android:background="@drawable/baseline_close_black_24" android:visibility="gone" app:layout_constraintBottom_toBottomOf="@+id/textView2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/textView" /> </androidx.constraintlayout.widget.ConstraintLayout> 

File tata letak ini berisi Tampilan Navigasi dan komponen lain yang membentuk tata letak untuk Navigasi Drawer. Untuk membuat tata letak ini, kita membutuhkan kelas fragmen yang memperluas BottomSheetDialogFragment:


 class BottomNavigationDrawerFragment: BottomSheetDialogFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_bottom_navigation_drawer, container, false) } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) navigation_view.setNavigationItemSelectedListener { menuItem -> // Bottom Navigation Drawer menu item clicks when (menuItem.itemId) { // R.id.nav1 -> context!!.toast(getString(R.string.nav1_clicked)) } // Add code here to update the UI based on the item selected // For example, swap UI fragments here true } } } 

Ketika Anda mengklik ikon Navigasi Drawer, sebuah instance dari fragmen ini dibuat, yang ditampilkan sebagai jendela modal:


 override fun onOptionsItemSelected(item: MenuItem?): Boolean { when (item!!.itemId) { android.R.id.home -> { val bottomNavDrawerFragment = BottomNavigationDrawerFragment() bottomNavDrawerFragment.show(supportFragmentManager, bottomNavDrawerFragment.tag) } } return true } 

Artikel ini menyimpulkan seri artikel kami tentang BottomAppBar. Anda dapat menemukan kode sumber untuk artikel ini di Github . Beri komentar dan ajukan pertanyaan.


← Implementasi BottomAppBar. Bagian 1: Komponen material untuk Android
← Implementasi BottomAppBar. Bagian 2: Menu dan Kontrol Laci Navigasi

Source: https://habr.com/ru/post/id422445/


All Articles