Activity之间的交互
一、MainActivity→SecondActivity
方法 1 intent中的方法直接传入
MainActivity.java文件中,使用intent.putExtra方法,将一个字符串传入到SecondActivity
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
//往SecondActivity中传入一个String:慕课网
intent.putExtra(BUTTON_TITLE, getString(R.string.imooc_title));
startActivity(intent);
SecondActivity文件
final Button button = findViewById(R.id.sec_btn);
if(getIntent()!=null){
String buttonTitle = getIntent().getStringExtra(MainActivity.BUTTON_TITLE);
button.setText(buttonTitle);
}
方法 2 绑定Bundle间接传入
Bundle: A mapping from String keys to various Parcelable values.
(译:从字符串键到各种可分块值的一个映射。)key-value类型
可以通过在Bundle中放多组值,再由intent传递过去
MainActivity.java文件
Intent intent = new Intent(MainActivity.this,DialogActivity.class);
Bundle bundle = new Bundle();
bundle.putString(BUTTON_TITLE,getString(R.string.imooc_title));
intent.putExtra(BUTTON_TITLE,bundle);
startActivity(intent);
SecondActivity.java文件
Button button = findViewById(R.id.dia_btn);
if(getIntent()!=null){
Bundle bundle = getIntent().getBundleExtra(MainActivity.BUTTON_TITLE);
//注意判空操作
if(bundle!=null){
String buttonTitle = bundle.getString(MainActivity.BUTTON_TITLE);
button.setText(buttonTitle);
}
}
方法 3 采用序列化的方式传入
Step 1 创建实体类实现序列化接口
public class User implements Serializable {
public String name;
public int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Step 2 创建对象实例并传输
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
User user = new User();
user.setName("轩轩");
user.setAge(10);
intent.putExtra(BUTTON_TITLE,user);
startActivity(intent);
Step 3 接受数据
final Button button = findViewById(R.id.sec_btn);
if(getIntent()!=null){
//getSerializableExtra()方法 获取序列化后的对象
User user = (User) getIntent().getSerializableExtra(MainActivity.BUTTON_TITLE);
button.setText(user.getName());
}
测试结果
二、SecondActivity→MainActivity
Step 1 将startActivity()方法改为startActivityForResult()方法
//参1:intent;参2:请求码<自己定义,每个页面可以有不同的请求码>
startActivityForResult(intent,10);
Step 2 在SecondActivity回到MainActivity中设置setResult()方法
final Button button = findViewById(R.id.sec_btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent secIntent = new Intent();
secIntent.putExtra("test","我回来了!");
//setResult有两种方式
//1、只返回一个结果标识码;2、一个结果标识码+一个intent
//setResult(RESULT_OK);
setResult(RESULT_OK,secIntent);
finish();
}
});
Step 3 在MainActivity的onActivityResult()方法获取返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 10 && resultCode == RESULT_OK ){
if(data!= null){
String str = data.getStringExtra("test");
setTitle(str);
Toast.makeText(this,str,Toast.LENGTH_SHORT).show();
}
}
}
测试结果
弹出来的Toast 就是test中设置的值