美文网首页
Navigation小结

Navigation小结

作者: 为什么要简称 | 来源:发表于2019-01-08 09:35 被阅读11次

    一、首先Activity布局中得有一个唤做androidx.navigation.fragment.NavHostFragment<fragment>,导航玩耍的destination就再这里刷刷切换

    <fragment
        android:id="@+id/my_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost="true"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        app:navGraph="@navigation/mobile_navigation"></fragment>
    
    • android:name="androidx.navigation.fragment.NavHostFragment"app:defaultNavHost="true" 把系统后退按钮连接到NavHostFragment
    • app:navGraph="@navigation/mobile_navigation"HavHostFragment和导航图关联起来,导航图中定义了在NavHostFragment 中可以导航的所有destinatioin

    二、看用什么进行导航

    当然不管怎么玩都要先获取NavController的实例,而在NavHostFragment中就有一个NavController的实例。
    所以在第一步中布局好的<fragment>就可以掏出来了:

    val host = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment?? : return
    
    val navController = host.navController
    

    妙不妙。

    1)底部栏

    这个简单一点先说这个。

    • 布局有个BottomNavigationView

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottom_nav"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            app:menu="@menu/bottom_menu"/>
      
    • 在Activity中

        private fun setupBottomNav(navController: NavController){
            val bottomNav = findViewById...
            bottom?.setupWithNavController(navController)
        }
      
    2)菜单
    • 用菜单进行navigate的话,自然先要填充菜单的,于是:
    override fun onCreateOptionsMenu(menu:Menu?):Boolean{
        menuInflater.inflate(R.menu...)
        return true
    }
    
    • 我们知道菜单是挂载actionbar上的,所以首先填充一个ActionBar。现在紧跟时代使用androidx了,所以用androidx.appcompat.widget.Toolbar来代替ActionBar:
    setSupportActionBar(toolbar)
    
    • 接下来ActionBar 和菜单就要发生一些故事了
    var appBarConfiguration = AppBarConfiguration(setOf(...))
    

    appBarConfiguration用来告诉ActionBar,哪些destinatioin是根部,显示根部时,actionbar不显示返回按钮,其他destination会显示返回按钮的。

    private fun setupActionBar(navController: NavController, appBarConfiguration: AppBarConfiguration){
        setupActionBarWithNavController(navController, appBarConfiguration)
    }
    

    如果菜单中有些item没有映射destination而又想处理,重写onOptionsItemSelected 就好了。

    3)抽屉
    • 布局文件
    <androidx.drawerlayout.widget.DrawerLayout
      ...>
        ...
        <com.google.android.material.navigation.NavigationView
          .../>
    </androidx.drawerlayout.widget.DrawerLayout>
    
    • 抽屉要和两个东西发生勾当
      1)ActionBar 和 DrawerLayout(抽屉布局)
      2)NavigationController 和 NavigationView(导航View)

    ActionBar
    在传统菜单部分中有一个唤做AppBarConfiguration的东西,哪个时候是这样初始化的:

    appBarConfiguration = AppBarConfiguration(setOf(...))
    

    现在需要让drawerLayout和AppBar联系起来,就要改为:

    appBarConfiguration = AppBarConfiguration(setOf(...), drawerlayout)
    

    然后就该导航View 和 NavController了:

    private fun setupDrawerNav(navController: NavController){
        val sideNavView = findViewById<NavigationView>(...)
        sideNavView.setupWithNavController(navController)
    }
    

    相关文章

      网友评论

          本文标题:Navigation小结

          本文链接:https://www.haomeiwen.com/subject/uewurqtx.html