接收xml参数_Navigation(二)使用safe args传递参数

bb3dc9bf546d46cf892c749478ba99fe.png

在未使用safe args之前,我们通常通过以下方式在Fragment之间传递数据。

传递参数:

//未采用safe args的传递方式
Bundle bundle = new Bundle();
bundle.putString("user_name", "Michael");
bundle.putInt("age", 30);
Navigation.findNavController(v).navigate(R.id.action_mainFragment_to_secondFragment, bundle);

接收参数:

//未采用safe args的接收方式
Bundle bundle = getArguments();
if(bundle != null)
{
    String userName = bundle.getString("user_name");
    int age = bundle.getInt("age");
    TextView tvSub = view.findViewById(R.id.tvSub);
    tvSub.setText(userName + age);
}


让我们对比一下safe args能为我们带来哪些变化。

1.首先我们需要安装插件。在Projectbuild.gradle文件中添加

dependencies {

    classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"

}

2.接着,我们需要引用该插件。在appbuild.gradle文件中添加

apply plugin: 'androidx.navigation.safeargs'

3.在导航图中添加<argument/>标签。我们可以直接在Text中编写XML代码,也可以通过Design面板添加

<fragment
    android:id="@+id/mainFragment"
    android:name="com.michael.safeargsdemo.MainFragment"
    android:label="fragment_main"
    tools:layout="@layout/fragment_main">

    <action
        android:id="@+id/action_mainFragment_to_secondFragment"
        app:destination="@id/secondFragment"
        app:popEnterAnim="@anim/slide_in_left"
        app:popExitAnim="@anim/slide_out_right"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left"/>

    <!-- 添加参数 -->
    <argument
        android:name="user_name"
        app:argType="string"
        android:defaultValue='"unknown"'/>

    <!-- 添加参数 -->
    <argument
        android:name="age"
        app:argType="integer"
        android:defaultValue="0"/>

</fragment>

添加之后,我们可以在app/generatedJava中看到safe args插件为我们生成的代码文件

0f7deb5d6563bd185c9cbf76f16720ec.png

最后,我们需要在Fragment中利用这些生成的代码文件,在Fragment之间进行参数传递。

传递参数:

//通过safe args完成参数传递
Bundle bundle = new MainFragmentArgs.Builder().setUserName("Michael").setAge(30).build().toBundle();
Navigation.findNavController(v).navigate(R.id.action_mainFragment_to_secondFragment, bundle);

接收参数:

//通过safe args完成参数接收
Bundle bundle = getArguments();
if(bundle != null)
{
    String userName = MainFragmentArgs.fromBundle(getArguments()).getUserName();
    int age = MainFragmentArgs.fromBundle(getArguments()).getAge();
    TextView tvSub = view.findViewById(R.id.tvSub);
    tvSub.setText(userName + age);
}

正如插件safe args名字所代表的意思,它的主要好处在于安全的参数类型,通过getter setter的方式来对参数进行更友好的操作。

演示动画:

8192dd464f1cb44c5fbaf3612afbc4e5.gif

项目仓库地址:

michaelye/SafeArgsDemo​github.com
ffa35c0ec28282b10b511d1e358b9685.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值