soapgu/PlayPen

Navigation in Android (二)——Action&parameter

Opened this issue · 0 comments

  • 引言

上一篇我介绍了Navigation的入门。
这一篇我们专门解决导航的跳转问题,怎么跳转,怎么传参数

  • Action

上一篇我们知道destination,就是导航中的一个个点。
那么怎么把destinations一个个关联起来就是路径,就是action

只要通过ide,拖动空心圆就能建立关联
图片

action的id可以通过Resource关联

  • 基于id导航

上一篇我们提到可以通过目的地的id来导航
那当然也通过action的id来导航
Navigation.findNavController(view).navigate(R.id.viewTransactionsAction);

  • 为目的地增加参数

我们知道,没有参数的“死路径”是不具备高度动态性的,参数是一定要加的。

  1. 首先我们在ide中选中目的地
  2. 查看在 Attributes 面板中“Arguments”
  3. 点击+,输入name和type

图片

如图所示 这样到相关目的的action就会默认带相关参数
  • 传递参数

好了参数定义好了,要怎么传怎么收那?

  • 使用 Bundle 对象在目的地之间传递参数
    虽然有“丐版”传递参数的办法,但是为毛我还要再重新自己写一下参数的封装和拆分啊。我在导航图里面的定义一定都没用到。显然导航图里面的参数用意不是这么用的。

  • 使用 Safe Args 传递安全的数据
    这已经是标配选项,如果要用参数传递就并不是一个可选项,不选虽然不至于不能用但是不方便

build.gradle增加classpath

buildscript {
    repositories {
        google()
    }
    dependencies {
        def nav_version = "2.4.1"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

在app的build.gradle的plugin里面增加
id 'androidx.navigation.safeargs'

导航跳转入口

binding.btnSpace.setOnClickListener(v -> {
            HomeFragmentDirections.ActionHomeFragmentToSpaceFragment action = HomeFragmentDirections.actionHomeFragmentToSpaceFragment("Hello Arg from Home");
            Navigation.findNavController(v).navigate(action);
        });

这里HomeFragmentDirections是自动生成的代码,我只需正确调用api就行。基本上一看就懂

目的地参数接收

@Override
   public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
       super.onViewCreated(view, savedInstanceState);
       textView = view.findViewById(R.id.space_tv);
       textView.setText( "Space arg:" + SpaceFragmentArgs.fromBundle(getArguments()).getSoapTest() );
   }

相关Demo练习repository