Activity之间传递参数(四)

时间:2023-11-10 15:11:50

--------siwuxie095

获取Activity的返回参数

1、首先修改两个布局文件,都修改为 LinearLayout 布局,

添加orientation属性为:vertical。

(1)为 activity_main.xml 添加一个 TextView,用于显示返回的数据

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:orientation="vertical"

tools:context="com.siwuxie095.sendargs.MainActivity">

<TextView

android:text="TextView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/textView"

android:layout_weight="1" />

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/btnStartAty"

android:text="启动另一个Activity"/>

</LinearLayout>

(2)为 activity_the_aty.xml 添加一个 EditText 和 Button,分别用于 输入

返回数据 和 点击返回第一个Activity

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_the_aty"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:orientation="vertical"

tools:context="com.siwuxie095.sendargs.TheAty">

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello World"

android:id="@+id/tv"/>

<EditText

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:inputType="textPersonName"

android:text="Name"

android:ems="10"

android:id="@+id/editText" />

<Button

android:text="Send Back"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/button" />

</LinearLayout>

2、在 TheAty.java 中,添加 editText的声明和定义,为Button添加鼠标响应事件

package com.siwuxie095.sendargs;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.EditText;

import android.widget.TextView;

public class TheAty extends AppCompatActivity {

private TextView tv;

private EditText editText;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_the_aty);

//TheAty是通过MainActivity中的Intent启动,直接通过getIntent()方法

//获取与这个Activity相关的Intent

Intent i=getIntent();

// //在第二个Activity 即TheAty 获取Bundle

//// Bundle data=i.getExtras();

// Bundle data=i.getBundleExtra("data");

//要访问TextView,先在上面声明

//findViewById()的返回值在编译时只能查看到类型是View,而事实上是TextView类型

//需要强制类型转换

tv= (TextView) findViewById(R.id.tv);

//同tv

editText= (EditText) findViewById(R.id.editText);

// //调用setText()方法设置字符串,这里字符串通过Intent获取

// tv.setText(i.getStringExtra("data"));

// 需要做一个强制类型转换

// User user= (User) i.getSerializableExtra("user");

//不需要强制类型转换

User user=i.getParcelableExtra("user");

//直接通过setText()方法传入字符串即可

tv.setText(String.format("User Info(name = %s, age = %d)",user.getName(),user.getAge()));

// //用到了String.format()

// // 假如有一个不存在的数据如namex

// // 那么getString()有一个重载函数可以设置默认值

// tv.setText(String.format("name = %s, age = %d, namex = %s",data.getString("name"),data.getInt("age"),data.getString("namex","Mary")));

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent i=new Intent();

i.putExtra("data",editText.getText().toString());

//setResult() 设置返回值:可设置返回状态码和返回数据(可重载)

//不同状态码代表不同意义在MainActivity中可以根据传回的状态码

//判断发回数据的状态

setResult(1,i);

//结束当前Activity

finish();

}

});

}

}

3、在 MainActivity.java 中,startActivity()被替换,同时重写函数 onActivityResult()

package com.siwuxie095.sendargs;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private TextView textView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//需要强制类型转换

textView= (TextView) findViewById(R.id.textView);

findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//创建一个new Intent()实例,传入Context和Class类型的参数

//对应MainActivity.this 和被启动的Activity的类定义 TheAty.class

Intent i = new Intent(MainActivity.this,TheAty.class);

// //通过Intent对象,调用putExtra()方法,传参

// //这里传入String和String类型的参数,实际上就是键值对

// i.putExtra("data","你好我是传递的参数");

// //传递数据包要用到Bundle,通过Bundle存入多种类型数据,传给第二个Activity

// Bundle b=new Bundle();

// //b.putBundle(); 即Bundle也可以嵌入Bundle

// b.putString("name","Jack");

// b.putInt("age",22);

// //putExtras() 传入Bundle

//// i.putExtras(b);

// //除了通过putExtras()传,还能用下面的putExra()

// i.putExtra("data",b);

i.putExtra("user",new User("Bill",18));

// //传入i

// startActivity(i);

//若要接收到TheAty传回的参数,不能使用startActivity(i)

//要使用下面的函数,接收传回的参数

//requestCode 请求代码传给第二个Activity 由第二个Activity再传回

//通过请求代码确定此次请求的意义

startActivityForResult(i,0);

}

});

}

//重写函数 onActivityResult() 有请求码和结果码

// 通过请求码判断请求的意义通过结果码判断结果数据的状态

//第三个参数Intent的数据来源于TheAty的setRsult()的第二个参数

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

textView.setText("另一个Activity返回的数据是:"+data.getStringExtra("data"));

}

}

4、User.java 不变

package com.siwuxie095.sendargs;

import android.os.Parcel;

import android.os.Parcelable;

import java.io.Serializable;

/**

* Created by siwux on 2017/1/2.

*/

//public class User implements Serializable{

public class User implements Parcelable{

private String name;

private 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;

}

public User(String name, int age) {

this.name = name;

this.age = age;

}

//第一个方法不用管

@Override

public int describeContents() {

return 0;

}

//向目标dest的Parcel里写数据因为Parcelable没有全自动序列化机制需要手动写

//将数据保存起来方便传递给其他程序或Activity

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(getName());

dest.writeInt(getAge());

}

//还需创建一个Creator,泛型是User

public static final Creator<User> CREATOR = new Creator<User>() {

//createFromParcel() 通过一个Parcel来创建对象

@Override

public User createFromParcel(Parcel source) {

//直接返回一个new User()

// User中如果数据过多,也可以打包成Bundle

// 直接writeBundle() readBundle()即可

return new User(source.readString(),source.readInt());

}

@Override

public User[] newArray(int size) {

return new User[size];

}

}; //注意这里还要加分号

}

5、工程结构目录一览:

Activity之间传递参数(四)

6、运行结果一览:

Activity之间传递参数(四)

Activity之间传递参数(四)

Activity之间传递参数(四)

【made by siwuxie095】