美文网首页
Android 最简单的 Navigation 使用

Android 最简单的 Navigation 使用

作者: Asbefore如初_3142 | 来源:发表于2018-11-20 17:11 被阅读0次

简单的一个 Navigation 使用

现在很多 Navigation 使用都是直接照搬 google 的官方demo:https://github.com/googlecodelabs/android-navigation
然后把官方文档翻译一下,很绕。。。
这里就自己记录一下自己的demo 编写过程

需要注意的是,Navigation 需要 Android Studio 到 3.2 版本以上

新建项目

  1. 使用 Android Studio 新建一个项目
  2. build.gradle 中导入依赖
dependencies {
    implementation "android.arch.navigation:navigation-fragment:1.0.0-alpha02"
    implementation "android.arch.navigation:navigation-ui:1.0.0-alpha02"
}
  1. res 目录上右键 new -> Android Resource Directory ,选择 navigation
    navigation

这样可以将 navigation 的文件存放在这个目录下

创建导航文件和其他Fragment

创建三个Fragment

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        Log.v("main nav fragment create view")
        val view = inflater.inflate(R.layout.main_fragment, container, false)

        return view
    }

三个Fragment中只需要实现 onCreateView 就可以了,分别填充不同的布局即可
在这里,第一个Fragment为 MainNavFragment,第二个:NavFragment2,第三个NavFragment3

创建导航文件 main_activity_navigation

<?xml version="1.0" encoding="utf-8"?>
<navigation 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/main_activity_navigation"
            app:startDestination="@id/main_fragment">

    <fragment
            android:id="@+id/main_fragment"
            android:name="com.example.navigationproj.Fragment.MainNavFragment"
            tools:layout="@layout/main_fragment">
        <action
                app:destination="@id/nav_fragment2"
                android:id="@+id/action_start_nav_fragment2"/>
    </fragment>
    <fragment
            android:id="@+id/nav_fragment2"
            android:name="com.example.navigationproj.Fragment.NavFragment2"
            tools:layout="@layout/main_fragment_2">
        <action
                android:id="@+id/action_start_nav_fragment3"
                app:destination="@id/nav_fragment3"/>
    </fragment>
    <fragment
            android:id="@+id/nav_fragment3"
            android:name="com.example.navigationproj.Fragment.NavFragment3"
            tools:layout="@layout/main_fragment_3">
        <action
                android:id="@+id/action_start_nav_mainfragment"
                app:destination="@id/main_fragment"/>
    </fragment>

</navigation>

tools:layout="xxx" 分别对应的是 Fragment 填充的布局

配置 Activity 的布局

app:navGraph 后面引用的就是导航文件 main_activity_navigation

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <fragment android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:id="@+id/mainFragmentView"
              android:name="androidx.navigation.fragment.NavHostFragment"
              app:navGraph="@navigation/main_activity_navigation"
              app:defaultNavHost="true"/>


</android.support.constraint.ConstraintLayout>

需要注意的是 fragment 中的 android:name 后面配置的Fragment 不能和导航文件中的 app:startDestination 相同,否则会导致 Fragment创建两次,所以这里使用系统的默认实现,也就是 androidx.navigation.fragment.NavHostFragment
而在导航文件中 使用的是 @id/main_fragment 最终导向的是 com.example.navigationproj.Fragment.MainNavFragment
其实系统的 androidx.navigation.fragment.NavHostFragment 是一个空白Fragment ,它的 onCreateView 返回的是一个空白的布局。只是用来实现导航的。

这样就可以正常编译启动了

为了查看Fragment页面跳转效果,把 MainNavFragment 中的 onCreateView 改成如下:

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        Log.v("main nav fragment create view")
        val view = inflater.inflate(R.layout.main_fragment, container, false)
        view.startBtn.setOnClickListener {
            Log.v("start fragment 2 btn onclick ")
            NavHostFragment.findNavController(this@MainNavFragment).navigate(R.id.action_start_nav_fragment2)
        }
        return view
    }

Navigation 使用极其方便,如果是自己实现Fragment之间的跳转,需要编写的代码比较多,而现在。仅仅使用了一行NavHostFragment.findNavController(this@MainNavFragment).navigate(R.id.action_start_nav_fragment2)而已。而且还不需要处理Fragment 穿透的问题等等。。

相关文章

网友评论

      本文标题:Android 最简单的 Navigation 使用

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