Navigation是指支持用户导航、进入和退出应用中不同内容片段的交互。用于处理 Fragment事务,使fragment之间可以自由切换和跳转,同时还包括导航界面模式(例如抽屉式导航栏和底部导航),可以降低用户工作量
如果要在应用中导航,则通过NavController,沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。NavController 就可以在NavHost里进行跳转。
在Module的build.gradle下添加如下依赖,再进行同步,完成环境设置
dependencies {// 指定Navigation的版本def nav_version = "2.5.3"// Java language implementationimplementation "androidx.navigation:navigation-fragment:$nav_version"implementation "androidx.navigation:navigation-ui:$nav_version"// Kotlinimplementation "androidx.navigation:navigation-fragment-ktx:$nav_version"implementation "androidx.navigation:navigation-ui-ktx:$nav_version"// Feature module Supportimplementation "androidx. navigation:navigation-dynamic-features-fragment:$nav_version"// Testing NavigationandroidTestImplementation "androidx. navigation:navigation-testing:$nav_version"// Jetpack Compose Integrationimplementation "androidx.navigation:navigation-compose:$nav_version"}
导航图是一种资源文件,其中包含Navigation所有目的地和操作。会显示应用的所有导航路径。
这样就完成了空白导航图的创建,这时来到res文档下就会看到navigation文件夹还有你创建的导航图
分成两种方法:
在activity中加入如下代码
目的地相当于是导航图中的一个个地点,展示各种界面内容
回到 Navigation Editor 界面就可以看到导航图中已经有了一个目的地
操作会将一个目的地连接到另一个目的地,即一个界面是否可以跳转到另一个界面
为了演示,我在上面的基础上再建了一个BlankFragment2
选中目的地后将该目的地右方的圆圈拖到另一个目的地,松开鼠标后两个目的地以箭头连接,如下图所示
为了演示,我在blankFragment里增添了一个按钮用来跳转至blankFragment2
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_blank, container, false);View button = view.findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {// action_blankFragment_to_blankFragment22为两目的地之间连接的id或者要导航向的目的地idNavigation.findNavController(view).navigate(R.id.action_blankFragment_to_blankFragment22);}});// Inflate the layout for this fragmentreturn view;}
Navigation支持多个返回堆栈可让用户在各个页面之间自由切换,同时不会在任何页面中丢失所处的位置,不需要导航图中有对应的连接就可以进行返回操作
为了演示,我在blankFragment2里增添一个返回按钮
@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_blank2, container, false);Button button2 = view.findViewById(R.id.button2);button2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//返回Navigation.findNavController(view).popBackStack();}});// Inflate the layout for this fragmentreturn view;}
Navigation 支持通过定义目的地参数将数据附加到导航操作,实现数据在两个fragment间的传输。
为了演示,我在前面的blankFragment和blankFragment2中分别加上EditText和TextView,用来实现传递数据和接收数据
查看code该参数已添加到 XML 中。点击 Text 标签页以切换到 XML 视图,就会发现参数已添加到接收该参数的目的地。
如下图所示,我所设置的参数名称为textString,参数类型为string
EditText editText = view.findViewById(R.id.editText);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String textString = String.valueOf(editText.getText());Bundle bundle=new Bundle();bundle.putString("textString", textString);Navigation.findNavController(view).navigate(R.id.action_blankFragment_to_blankFragment22,bundle);}});
TextView textView = view.findViewById(R.id.textView1);textView.setText(getArguments().getString("textString"));
这样就可以实现在blankFragment里输入数据传送到blankFragment2里
blankFragment 输入效果
blankFragment2 输出效果
原作者:林冠圳
原文链接:原文链接