在未使用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.首先我们需要安装插件。在Project的build.gradle文件中添加
dependencies {
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"
}
2.接着,我们需要引用该插件。在app的build.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插件为我们生成的代码文件
最后,我们需要在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的方式来对参数进行更友好的操作。
演示动画:
项目仓库地址:
michaelye/SafeArgsDemogithub.com