简单的一个 Navigation 使用
现在很多 Navigation 使用都是直接照搬 google 的官方demo:
https://github.com/googlecodelabs/android-navigation
然后把官方文档翻译一下,很绕。。。
这里就自己记录一下自己的demo 编写过程需要注意的是,Navigation 需要 Android Studio 到 3.2 版本以上
新建项目
- 使用
Android Studio
新建一个项目 - 在
build.gradle
中导入依赖
dependencies {
implementation "android.arch.navigation:navigation-fragment:1.0.0-alpha02"
implementation "android.arch.navigation:navigation-ui:1.0.0-alpha02"
}
- 在
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 穿透的问题等等。。
网友评论