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