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)中,并根据你需要导航的需求将他们连线

其中带箭头的线就是你的页面跳转逻辑,每一条线称为一个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中就会显示导航图中的内容。

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. 浅谈Java中Collections.sort对List排序的两种方法
  2. mybatisplus的坑 insert标签insert into select无参数问题的解决
  3. Python技巧匿名函数、回调函数和高阶函数
  4. python list.sort()根据多个关键字排序的方法实现
  5. android EditText设置不可写
  6. Android(安卓)拨号器的简单实现
  7. android实现字体闪烁动画的方法
  8. Android中不同应用间实现SharedPreferences数据共享
  9. [Android(安卓)NDK]Android(安卓)JNI开发例子 ---3 在JNI中实现o

随机推荐

  1. Android屏幕适配简单总结,PT适配方案
  2. Android动态加载jar/dex[转]
  3. 使用Kotlin实现Android中的MVP模式
  4. 如何将Android(安卓)Studio的工程导入到e
  5. Android(安卓)HIDL HAL 接口定义语言详解
  6. android 如何动态的加载类----app插件技
  7. 微信团队分享:微信Android版小视频编码填
  8. 【android】半角符号与全角符号的转换
  9. Android、iOS和Java通用的AES128加密解密
  10. Android权限管理的一个bug