Jetpack学习-5-Navigation简单使用
- 导航图:在一个集中位置包含所有导航相关信息的 XML 资源。包括所有的fragment及相关fragment切换的路径。(类似于地图功能)
NavHost
:显示导航图中目标的空白容器。导航组件包含一个默认NavHost
实现 (NavHostFragment
),可显示 Fragment 目标。(功能类似于汽车)NavController
:在NavHost
中管理应用导航的对象。当用户在整个应用中移动时,NavController
会安排NavHost
中目标内容的交换。(功能类似于方向盘,想显示地图上的位置就切换过去,没有路径则过不去)
implementation "androidx.navigation:navigation-fragment:2.3.2"implementation "androidx.navigation:navigation-ui:2.3.2"
1,建立导航图
在res下新建导航图文件夹navigation,右键新建->Navigation Resource File
2,新建3个Fragment,WelcomeFragment LoginFragment RegisterFragment
自动生成代码
package com.sun.navigation;import android.os.Bundle;import androidx.fragment.app.Fragment;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;/*** A simple {@link Fragment} subclass.* Use the {@link LoginFragment#newInstance} factory method to* create an instance of this fragment.*/
public class LoginFragment extends Fragment {// TODO: Rename parameter arguments, choose names that match// the fragment initialization parameters, e.g. ARG_ITEM_NUMBERprivate static final String ARG_PARAM1 = "param1";private static final String ARG_PARAM2 = "param2";// TODO: Rename and change types of parametersprivate String mParam1;private String mParam2;public LoginFragment() {// Required empty public constructor}/*** Use this factory method to create a new instance of* this fragment using the provided parameters.** @param param1 Parameter 1.* @param param2 Parameter 2.* @return A new instance of fragment LoginFragment.*/// TODO: Rename and change types and number of parameterspublic static LoginFragment newInstance(String param1, String param2) {LoginFragment fragment = new LoginFragment();Bundle args = new Bundle();args.putString(ARG_PARAM1, param1);args.putString(ARG_PARAM2, param2);fragment.setArguments(args);return fragment;}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getArguments() != null) {mParam1 = getArguments().getString(ARG_PARAM1);mParam2 = getArguments().getString(ARG_PARAM2);}}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_login, container, false);}
}
很nice,自动生成布局,传参相关代码也写好了。
3,当前设计方向为欢迎能进入登录及注册,登录能进去注册,通过在login_navigation.xml进行拖拽完成,得到如下识图(地图)
对应的代码如下
<?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/login_navigation"app:startDestination="@id/welcomeFragment"><fragmentandroid:id="@+id/welcomeFragment"android:name="com.sun.navigation.WelcomeFragment"android:label="fragment_welcome"tools:layout="@layout/fragment_welcome" ><actionandroid:id="@+id/action_welcomeFragment_to_loginFragment"app:destination="@id/loginFragment" /><actionandroid:id="@+id/action_welcomeFragment_to_registerFragment"app:destination="@id/registerFragment" /></fragment><fragmentandroid:id="@+id/loginFragment"android:name="com.sun.navigation.LoginFragment"android:label="fragment_login"tools:layout="@layout/fragment_login" ><actionandroid:id="@+id/action_loginFragment_to_registerFragment"app:destination="@id/registerFragment" /></fragment><fragmentandroid:id="@+id/registerFragment"android:name="com.sun.navigation.RegisterFragment"android:label="fragment_register"tools:layout="@layout/fragment_register" />
</navigation>
4,添加Fragment容器NavHostFragment
activity_main.xml<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/my_nav_host_fragment"android:name="androidx.navigation.fragment.NavHostFragment"//这是系统定义的专门用来显示navigation地图中fragment的fragmentandroid:layout_width="match_parent"android:layout_height="match_parent"app:defaultNavHost="true" //true 返回键会回到上一个fragment false返回键由activity响应,一般是退出activityapp:navGraph="@navigation/login_navigation" /></LinearLayout>
这样子显示部分就好了,activity启动后把androidx.navigation.fragment.NavHostFragment作为显示容器,加载navigation中的login_navigation导航图,在导航图上startDestination标识了welcomefragment是首先展示页,同时在welcomeFragment中,定义了2个action(跳转动作,路标?),可以跳转到LoginFragment和RegisterFragment,另外,LoginFragment也有动作能跳转到RegisterFragment上,下面在代码中添加NavControIIer(导航控制器?)完成页面切换。
普通导航
Navigation.findNavController(v).navigate(R.id.action_welcomeFragment_to_loginFragment);带参数导航
Bundle bundle=new Bundle();
bundle.putString("phone",et_phone.getText().toString());
Navigation.findNavController(v).navigate(R.id.action_loginFragment_to_registerFragment,bundle);如何导航到一个地图上本页面无法到达的页面会咋样?
报错参数异常
java.lang.IllegalArgumentException: Navigation action/destination com.sun.navigation:id/action_welcomeFragment_to_registerFragment cannot be found from the current destination Destination
5,为了解决跳转的生硬,需要添加动画,在原始代码上,可以通过fragment事务的setCustomAnimations()进行处理,而navigation,直接在导航图上进行添加,这样就能把偏view的动画添加代码移动xml上
双击action,给fragment的切换添加动画
<fragmentandroid:id="@+id/welcomeFragment"android:name="com.sun.navigation.WelcomeFragment"android:label="fragment_welcome"tools:layout="@layout/fragment_welcome"><actionandroid:id="@+id/action_welcomeFragment_to_loginFragment"app:destination="@id/loginFragment"app:enterAnim="@anim/window_right_in"app:exitAnim="@anim/window_left_out"app:popEnterAnim="@anim/window_left_in"app:popExitAnim="@anim/window_right_out" /><actionandroid:id="@+id/action_welcomeFragment_to_registerFragment"app:destination="@id/registerFragment"app:enterAnim="@anim/window_right_in"app:exitAnim="@anim/window_left_out"app:popEnterAnim="@anim/window_left_in"app:popExitAnim="@anim/window_right_out" /></fragment>
在导航图上自动出现了enterAnim和exitAnim的属性,这样就完成了动画的添加。
至此,navigation的基本操作已经完成,还有使用场景较少的深层链接,SafeArgs(个人不推荐)后续有时间再分析。
Android-Jetpack代码位置:github
Jetpack学习-5-Navigation简单使用相关推荐
- Android Jetpack 学习之Navigation、BottomNavigationView
先上效果图: Navigation组件,也可以理解成FragmentNavigation.它提供了多Fragment之间的转场.栈管理,帮助我们可以更轻松的使用Fragment.在抽屉式导航栏.底部导 ...
- Sunflower——Google官方的Jetpack学习项目笔记(Java版)
由于Google官网给出的该项目是Kotlin版本,我将其改造成Java版本,供大家学习参考,文末给出下载链接,里面包含了详细的注释说明. 该项目虽然简单,但是用到的知识很多,正所谓麻雀虽小五脏俱全, ...
- Android Jetpack组件之Navigation使用-源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- ios navigation的返回按钮长按_Android Jetpack架构组件 — Navigation入坑详解 [转]
前言 这是最近看见的觉得比较有意思的文,希望对大家的学习有帮助. Navigation 直接翻译即为导航,它是 Android Jetpack 组件之一,让单 Activity 应用成为首选架构.应用 ...
- Jetpack学习-Paging
个人博客 http://www.milovetingting.cn Jetpack学习-Paging Paging是什么 分页库可一次加载和显示一小块数据.按需载入部分数据会减少网络带宽和系统资源的使 ...
- WebGL(三)——学习Canvas及简单图形绘制
WebGL(三)--学习Canvas及简单图形绘制 Canvas简介 canvas是HTML5新增的一个可以使用javascript脚本在其中绘制图像的HTML元素(容器),它可以用来制作图像.动画, ...
- python自训练神经网络_tensorflow学习笔记之简单的神经网络训练和测试
本文实例为大家分享了用简单的神经网络来训练和测试的具体代码,供大家参考,具体内容如下 刚开始学习tf时,我们从简单的地方开始.卷积神经网络(CNN)是由简单的神经网络(NN)发展而来的,因此,我们的第 ...
- 学习了下简单的光照模型
博客园 闪存 首页 新随笔 联系 管理 订阅 随笔- 50 文章- 53 评论- 57 学习了下简单的光照模型 龙书和SDK光照的例子也看到几个了,今天看<GPU 编程与CG 语言之阳春白 ...
- VC学习笔记:简单绘图
VC学习笔记:简单绘图 SkySeraph Oct.29th 2009 HQU Email-zgzhaobo@gmail.com QQ-452728574 Latest Modified Date ...
最新文章
- 《数据分析实战 基于EXCEL和SPSS系列工具的实践》一第2章 数据分析的理论、工具、模型...
- 人民广场怎么走? 地铁换乘算法的实现 MikeTech | MikeTech
- java触发full gc的几种情况概述
- 涂抹mysql笔记-mysql复制特性
- win32中GBK、UTF8的互转
- 存储过程,触发器,分页练习
- .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入
- 使用Okta的单点登录保护您的Vert.x服务器
- java写入文件的几种方法分享
- S/4HANA生产订单增强WORKORDER_UPDATE方法BEFORE_UPDATE参数分析 1
- java单击按钮切换图片_JAVA点击按钮改变背景图片 跪求代码·
- Android开发笔记(六十三)HTTP访问的通信方式
- sqlmap使用手册
- CORBA版HelloWorld
- 红外测试操作步骤_红外分光测油仪操作步骤及注意事项
- word计算机板书,Word板书设计怎么写
- 如何通过里程碑控制项目进度
- NTFS Change Journal(USN Journal)详解
- bootstrap4导航栏居右
- Acwing活动打卡做题数统计爬虫