Navigation
文章目录
使用条件: AndroidStudio version >= 3.3
一种交互允许用户在应用程序中的不同内容之间进行浏览,浏览和退出。
导航组件由以下三个关键部分组成:
-
导航图:在一个集中位置包含所有与导航有关的信息的一种XML资源。这包括您应用程序中的所有单独内容区域(称为destinations),以及用户可以通过您的应用程序访问的可能路径。
-
NavHost
:一个空容器,用于显示导航图中的目的地。导航组件包含一个默认NavHost
实现NavHostFragment
,它显示片段目的地。 -
NavController
: 在NavHost
中管理应用程序导航的对象 。 当用户在整个应用程序中移动时,NavController在NavHost中协调目标内容的交换 。MainActivity中 activity_main.xml 资源:
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints"
/>
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
tools:ignore="MissingConstraints"
app:defaultNavHost= "true"
app:navGraph="@navigation/nav_graph"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
android:name
属性包含您的NavHost
实现的类名称。app:navGraph
属性将关联到NavHostFragment
导航图。导航图指定了NavHostFragment
用户可以导航到的所有目的地。app:defaultNavHost="true"
属性确保您NavHostFragment
拦截系统的“后退”按钮。请注意,NavHost
默认值只能是一个。如果您在同一布局中有多个主机(例如,两窗格布局),请确保仅指定一个defaultNavHost
建立导航图
- 在“项目”窗口中,右键单击res目录,然后选择“ 新建”>“ Android Resource File ”。出现“ 新资源文件”对话框。
- 在“ File name ”字段中键入一个名称,例如“ nav_graph”。
- 从资源类型下拉列表中选择 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/nav_graph">
</navigation>
建立、连接目的地
通过nav_graph中的Design 选项,点击白绿“+”,出现"Create new destination",可以建立Fragment
然后可以通过“ 房子 ”符号或者右键set as Start destination建立启动目的地
连接目的地,只要选中Design区域的Fragment页,右侧会出现圆形按钮,按需求连线建立对应关系就可以了
例如:
<?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/nav_graph"
app:startDestination="@id/blankFragment">
<fragment
android:id="@+id/blankFragment"
android:name="com.fight.navigation.BlankFragment"
android:label="fragment_blank"
tools:layout="@layout/fragment_blank" >
<action
android:id="@+id/action_blankFragment_to_whiteFragment"
app:destination="@id/whiteFragment" />
</fragment>
<fragment
android:id="@+id/whiteFragment"
android:name="com.fight.navigation.BlankFragment"
android:label="fragment_white"
tools:layout="@layout/fragment_blank">
</fragment>
</navigation>
导航到目的地
Java
NavHostFragment.findNavController(Fragment)
- [
Navigation.findNavController(Activity, @IdRes int viewId)
](https://developer.android.google.cn/reference/androidx/navigation/Navigation.html#findNavController(android.app.Activity, int)) Navigation.findNavController(View)
手势导航
从Android 10(API级别29)开始,Android系统支持完全基于手势的导航。应用程序开发人员应做两件事以确保其应用程序与此功能兼容:
- 将应用程序内容从一个边缘扩展到另一个边缘。
- 处理冲突的应用手势
边缘到边缘的应用程序内容
为了利用浮动导航栏提供的额外屏幕空间,您需要对应用程序进行一些更改。
设置透明系统栏
您可以通过在主题中设置以下值来实现( API目标级别为29或更高 ):
边缘到边缘的应用程序内容
为了利用浮动导航栏提供的额外屏幕空间,您需要对应用程序进行一些更改。
设置透明系统栏
您可以通过在主题中设置以下值来实现:
<!-- values-29/themes.xml: -->
<style name="AppTheme" parent="...">
<item name="android:navigationBarColor">@android:color/transparent</item>
<!-- Optional, but recommended for full edge-to-edge rendering -->
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
或者 可以使用Window.setNavigationBarColor()
和Window.setStatusBarColor()
来动态地执行此操作
设置UI可见性标志
为了能够边到边布置视图,应用必须告知系统该应用可以处理这种视图。您可以通过View.setSystemUiVisibility()
设置以下标志来完成此操作 :
STABLE)
这些标志一起告诉系统,你的应用程序应该全屏显示,就像导航栏和状态栏不存在一样。对于其他全屏事件,您还可以设置SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,它允许您在状态栏后面绘图。