目录
Android Jetpack应用指南学习笔记11使用safe args方式安全传递参数
1.1.在Project的build.gradle目录下添加插件:
1.2.在app的build.gradle目录下添加如下配置:
9.引入插件,在xml添加name和age2个属性后,重新进行项目同步,同步成功后会出现如下文件:编辑
Android Jetpack应用指南学习笔记11使用safe args方式安全传递参数
1.使用safe args之前我们先要安装插件,步骤如下:
1.1.在Project的build.gradle目录下添加插件:
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.0"
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
1.2.在app的build.gradle目录下添加如下配置:
apply plugin: 'androidx.navigation.safeargs'
2.通常Fragment之间我们传递参数是这样的:
Bundle bundle = new Bundle();
bundle.putString("name", "Michael");
bundle.putInt("age", 30);
Navigation.findNavController(v).navigate(R.id.action\_mainFragment\_to\_secondFragment, bundle);
3.通过safe args安全方式传递参数:
Bundle bundle = new MainFragmentArgs.Builder().setName("小霍").setAge(18).build().toBundle();
Navigation.findNavController(v).navigate(R.id.action\_mainFragment\_to\_secondFragment, bundle);
4.普通方式接收传递过来的参数:
//普通方式接收参数
if(bundle != null){
String userName = bundle.getString("name");
int age = bundle.getInt("age");
Log.d("bundleData1", "姓名:" + userName + "年龄:" + age);
tvTitle.setText(userName);
tvAge.setText(String.valueOf(age));
}
5.通过safe args接收参数:
if (bundle != null) {
userName = MainFragmentArgs.fromBundle(bundle).getName();
age = MainFragmentArgs.fromBundle(bundle).getAge();
Log.d("bundleData2", " 姓名: " + userName + " 年龄: " + age);
tvTitle.setText(userName);
tvAge.setText(String.valueOf(age));
}
6.主界面MainFragment完整代码如下:
/\*\*
\* @author: njb
\* @date: 2020/9/5 0005 1:20
\* @desc:
\*/
public class MainFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment\_main, container, false);
//方法一:未采用safe args的传递方式
view.findViewById(R.id.btnToSecondFragment).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = new Bundle();
bundle.putString("name", "Michael");
bundle.putInt("age", 30);
Navigation.findNavController(v).navigate(R.id.action\_mainFragment\_to\_secondFragment, bundle);
}
});
//方法二://通过safe args完成参数传递
/\* view.findViewById(R.id.btnToSecondFragment).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = new MainFragmentArgs.Builder().setName("小霍").setAge(18).build().toBundle();
Navigation.findNavController(v).navigate(R.id.action\_mainFragment\_to\_secondFragment, bundle);
}
});\*/
view.findViewById(R.id.btnToMineFragment).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Navigation.findNavController(v).navigate(R.id.action\_mainFragment\_to\_mineFragment);
}
});
return view;
}
}
7.第2个界面SecondFragment完整代码如下:
package com.example.navigationbasicdemo.fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.example.navigationbasicdemo.R;
/\*\*
\* @author: njb
\* @date: 2020/9/5 0005 1:23
\* @desc:
\*/
public class SecondFragment extends Fragment {
TextView tvTitle, tvAge;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment\_second, container, false);
tvTitle = view.findViewById(R.id.tvTitle);
tvAge = view.findViewById(R.id.tvSub);
Bundle bundle = getArguments();
//普通方式接收参数
if(bundle != null){
String userName = bundle.getString("name");
int age = bundle.getInt("age");
Log.d("bundleData1", "姓名:" + userName + "年龄:" + age);
tvTitle.setText(userName);
tvAge.setText(String.valueOf(age));
}
//通过safe args接收参数
/\* if (bundle != null) {
String userName = MainFragmentArgs.fromBundle(bundle).getName();
int age = MainFragmentArgs.fromBundle(bundle).getAge();
Log.d("bundleData2", " 姓名: " + userName + " 年龄: " + age);
tvTitle.setText(userName);
tvAge.setText(String.valueOf(age));
}\*/
return view;
}
}
8.navigation布局代码配置:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav\_graph"
app:startDestination="@id/mainFragment">
<fragment
android:id="@+id/mainFragment"
android:name="com.example.navigationbasicdemo.fragment.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"/>
<action
android:id="@+id/action\_mainFragment\_to\_mineFragment"
app:destination="@id/mineFragment"
app:enterAnim="@anim/slide\_in\_left"
app:exitAnim="@anim/slide\_in\_right"
app:popEnterAnim="@anim/slide\_out\_left"
app:popExitAnim="@anim/slide\_out\_right" />
<argument
android:name="name"
app:argType="string"
android:defaultValue="xiaozhang"/>
<argument
android:name="age"
app:argType="integer"
android:defaultValue="1"/>
</fragment>
<fragment
android:id="@+id/secondFragment"
android:name="com.example.navigationbasicdemo.fragment.SecondFragment"
android:label="fragment\_second"
tools:layout="@layout/fragment\_second"/>
<fragment
android:id="@+id/mineFragment"
android:name="com.example.navigationbasicdemo.fragment.mineFragment"
android:label="fragment\_mine"
tools:layout="@layout/fragment\_mine" />
</navigation>
9.引入插件,在xml添加name和age2个属性后,重新进行项目同步,同步成功后会出现如下文件:
10.运行结果如下图所示:
10.1 通过普通方式传递参数获取到的结果为:
10.2 通过safe args传递参数获取到的结果为:
11.总结:
以上就是今天的博客内容,使用safe args方式如果不配置navigation布局文件属性传递参数和获取参数都会失败,具体的可以参考官方文档,普通的方式和之前一样使用Bundle传递参数,需要注意的是接收参数时要判断bundle是否为空!!!如有问题及时沟通,希望对各位有所帮助,一起学习成长!!
12.项目源码地址如下:
NavigationDemo: Navigation(一)基础入门,包含布局创建添加和使用
本文转自 blog.csdn.net/u012556114/…,如有侵权,请联系删除。