Android在2019今年的开发者大会上提出了一个App只有一个activity的建议,因此作为未来android开发规范组件库的Jetpack也自然要遵循这个建议。所以Navigation正常来说是用于fragment的导航而不是activity的导航。同时,Jetpack提倡使用图形化界面对前端进行编程,所以使用Navigation时,用图形化界面要方便得多。(学了Jetpack的Navigation之后,你会发现…真香)

实现Navigation分三步:

1 实现导航图(navigation.xml)

    1.1 在res文件夹右键创建Android resource 文件,选择文件类型为Navigation,命名为nav(根据需要取名),之后会生成nav.xml文件,这就是导航图。

    1.2 创建fragment.java文件(as会自动生成fragment.java相关的xml文件,你可以手动修改fragment的xml文件的布局,我一般是修改为constraintlayout:依赖布局,依赖布局可以说是专门为可视化界面设计而出现的),之后切换到nav.xml的设计视图,点击设计视图左上角加号,将fragment添加到导航图(nav.xml)中,并根据你需要导航的需求将他们连线
Android Jetpack :Navigation 学习笔记_第1张图片
其中带箭头的线就是你的页面跳转逻辑,每一条线称为一个action,Android studio会自动帮你创建相应的action的xml标签,使用的时候直接取其id就行,自动创建的id也很人性化,比如我是将homefragment跳转到detailfragment,那么取action的id就是R.id.action_homeFragment_to_detailFragment。到这里导航图就完成了(导航图会根据你的连线自动选择一个fragment做为开始的fragment,当然你也可以自己设置)。

2 NavHost

    在activity_main.xml中添加NavHostFragment,相当于把我们关联后的fragment添加到activity_main.xml中,这时候我们的activity_main.xml中就会显示导航图中的内容。
Android Jetpack :Navigation 学习笔记_第2张图片

3 NavController:

在按钮事件中绑定NavController(顾名思义:导航控制者),指定你点击这个按钮点击后我要跳转的页面即可。

3.1 不带参数跳转:

        getView().findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //实例化NavController对象:controller                NavController controller = Navigation.findNavController(v);                //controller用navigate()方法执行跳转,跳转方式是R.id.action_homeFragment_to_detailFragment                controller.navigate(R.id.action_homeFragment_to_detailFragment);                            }        });

3.2 带参数跳转:

        getView().findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //实例化NavController对象:controller                NavController controller = Navigation.findNavController(v);                //获取EditText的输入作为参数                EditText editText = getView().findViewById(R.id.editText);                String s = editText.getText().toString();                                //将参数绑定到bundle对象里,键是“text”                Bundle bundle = new Bundle();                bundle.putString("text", s);                //跳转过程中添加第二个参数:bundle                controller.navigate(R.id.action_homeFragment_to_detailFragment,bundle);            }        });

3.3 在跳转到的页面取参数:

        String text = getArguments().getString("text");   //取键位“text”中的值        TextView textView = getView().findViewById(R.id.textView2);        textView.setText(text);

到这里navigation基本完成了,不过实现时navigation时可以把Jetpack的其他组件都一起实现,包括Viewmodel、Databing、Lifecycles、LiveData。你会发现Android的Jetpack架构是真的香(o(╥﹏╥)o不过在实现时我花了差不多10个小时,才把坑踩完)收益是真的大。

最后po一下超好的Android jetpack教程:
https://www.bilibili.com/video/BV1vx411Z71z
Android Jetpack的开发者文档:
https://developer.android.google.cn/jetpack

更多相关文章

  1. 什么是APK文件
  2. 浅谈Android五大布局——LinearLayout、FrameLayout, AbsoulteLa
  3. 【Android FFMPEG 开发】Android Studio 工程配置 FFMPEG ( 动态
  4. Android 布局 精准定位 平衡定位 相对定位
  5. Android中数据存储——文件存储数据

随机推荐

  1. 记录关于搭建mysql主从复制中遇见的问题
  2. Java数据持久层框架 MyBatis之API学习七(
  3. T-SQL中的随机数
  4. 我用的mysqlcc,我想看别人执行过哪些语句
  5. 今天看了一整天的汇编语言,真发现语言这东
  6. navicat+for+mysql破解版
  7. MySQL Packets larger than max_allowed_
  8. 如果在两个模式中存在具有相似名称的删除
  9. 如何利用SQL语句查询数据库中所有表的名
  10. 无法从SQLite数据库获取最后一行