安卓實現側滑選單加底部導航欄:DrawerLayout+BottomNavigationView
效果圖

image
主要程式碼
- MainActivity
package com.cxyzy.myapplication import android.os.Bundle import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.app.AppCompatActivity import androidx.core.view.GravityCompat import androidx.lifecycle.LiveData import androidx.lifecycle.Observer import androidx.navigation.NavController import androidx.navigation.ui.setupActionBarWithNavController import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.navigation.NavigationView import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.app_bar_main.* class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener { private var currentNavController: LiveData<NavController>? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (savedInstanceState == null) { setupBottomNavigationBar() } setSupportActionBar(toolbar) val toggle = ActionBarDrawerToggle( this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close ) drawerLayout.addDrawerListener(toggle) toggle.syncState() naviView.setNavigationItemSelectedListener(this) } override fun onRestoreInstanceState(savedInstanceState: Bundle?) { super.onRestoreInstanceState(savedInstanceState) setupBottomNavigationBar() } private fun setupBottomNavigationBar() { val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottom_nav) val navGraphIds = listOf(R.navigation.navi_first, R.navigation.navi_second) // Setup the bottom navigation view with a list of navigation graphs val controller = bottomNavigationView.setupWithNavController( navGraphIds = navGraphIds, fragmentManager = supportFragmentManager, containerId = R.id.nav_host_container, intent = intent ) // Whenever the selected controller changes, setup the action bar. controller.observe(this, Observer { navController -> setupActionBarWithNavController(navController) }) currentNavController = controller } override fun onSupportNavigateUp(): Boolean { return currentNavController?.value?.navigateUp() ?: false } /** * Overriding popBackStack is necessary in this case if the app is started from the deep link. */ override fun onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START) } if (currentNavController?.value?.popBackStack() != true) { super.onBackPressed() } } override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_toolbar, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.action_settings -> true else -> super.onOptionsItemSelected(item) } } override fun onNavigationItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.nav_camera -> { } R.id.nav_gallery -> { } R.id.nav_share -> { } R.id.nav_send -> { } } drawerLayout.closeDrawer(GravityCompat.START) return true } }
- activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.drawerlayout.widget.DrawerLayout 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/drawerLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="end"> <com.google.android.material.navigation.NavigationView android:id="@+id/naviView" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer" /> <include layout="@layout/app_bar_main" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.drawerlayout.widget.DrawerLayout>
Demo原始碼
https://gitee.com/cxyzy1/navigationDemo/tree/master/withDrawerLayout
安卓開發技術分享: https://www.jianshu.com/p/442339952f26
更多技術總結好文,請關注:「程式園中猿」
