Android应用开发(三):如何完成Activity之间的传递参数

简介: <p>本文介绍如何在<span style="font-family:Times New Roman">Activity</span><span style="font-family:宋体">之间传递参数,该参数包括简单数据、包</span><span style="font-family:Times New Roman">Bundle</span><span style="font-fa

本文介绍如何在Activity之间传递参数,该参数包括简单数据、包Bundle(提供2种方法,即有和无Bundle的两种方法)、值对象(提供2种方法,即SerializableParcelable的两种方法),最后介绍如何获取Activity的返回参数。以上所介绍的内容都提供了操作步骤和源码以便于大家交流与分享心得。

 

1、在Activity之间传递简单数据


1)、新建Button

activity_main.xml中加入如下代码:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/btnStartAty"
    android:text="启动另一个Activity"/>

效果如下图:

发现Button下面重叠着东西,这个东西就是activity_main.xml中原有的TextView,只需删除下面代码即可,

<TextView android:text="@string/hello_world" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/textView" />

删除代码后的效果如下图:


2)、新建Activity

直接在下图java文件夹下面直接新建即可。

新建的Activity命名为TheAtyAndroid Studio会自动在layout文件夹下生成activity_the_aty.xml,并且在AndroidManifest.xml中自动加入下面代码:

<activity
    android:name=".TheAty"
    android:label="@string/title_activity_the_aty" >
</activity>

接下来我们在activity_the_aty.xml中的TextView中设置一个id,即修改为如下代码:

<TextView android:text="@string/hello_world" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:id="@+id/tv" />

即将id设置为tv


3)、在MainActivity.java中用Intent传递参数

MainActivity.java中加入如下代码:

//用Intent传递参数
findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent i = new Intent(MainActivity.this,TheAty.class);
        i.putExtra("data","Activity send args");
        startActivity(i);
    }
});

4)、在TheAty.java中用getIntent接收参数

TheAty.java中的代码修改为:

public class TheAty extends AppCompatActivity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_the_aty);

        Intent i = getIntent();
        tv = (TextView) findViewById(R.id.tv);
        tv.setText(i.getStringExtra("data"));

    }

5)、测试结果

测试结果如下图:

修改MainActivity.java中传递的参数为”Activity send args,Fred!”,测试结果如下图:



2、两种方法在Activity之间传递包Bundle


1)、在MainActivity.java中传递包

MainActivity.java中传递包,修改代码如下:

 //传递简单数据
//                i.putExtra("data","Activity send args,Fred,Hello!");
//                startActivity(i);

                //传递包Bundle方法1
//                Bundle b = new Bundle();
//                b.putString("name","传递测试");
//                b.putInt("age",2);
//                b.putString("name1","Fred");
//                i.putExtras(b);
//                startActivity(i);

//                //传递包Bundle方法2
                Bundle b = new Bundle();
                b.putString("name","传递测试");
                b.putInt("age",2);
                b.putString("name1","Fred");
                i.putExtra("data",b);
                startActivity(i);


2)、在TheAty.java中用Bundle接收参数

TheAty.java中用Bundle接收参数,修改代码如下所示:

 //获取简单数据
//        Intent i = getIntent();
//        tv = (TextView) findViewById(R.id.tv);
//        tv.setText(i.getStringExtra("data"));

        //获取包Bundle方法1
//        Intent i = getIntent();
//        tv = (TextView) findViewById(R.id.tv);
//        Bundle data = i.getExtras();
//        tv.setText(String.format("name=%s,age=%d,name1=%s",data.getString("name"),data.getInt("age"),data.getString("name1", "Fred")));

        //获取包Bundle方法2
        Intent i = getIntent();
        tv = (TextView) findViewById(R.id.tv);
        Bundle data = i.getBundleExtra("data");
        tv.setText(String.format("name=%s,age=%d,name1=%s",data.getString("name"),data.getInt("age"),data.getString("name1", "Fred")));

3)、测试结果如下图


3、在Activity之间传递值对象


所谓的值对象,就是自定义的有数据类型的对象。

1)、新建一个自定义的数据类型

新建一个自定义的数据类型User.java,其代码如下:

package edu.fred.hqu.androidactivitysendargs;

/**
 * Created by Fred on 2015/8/27.
 */
public class User {

    //成员
    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;
    }
}

2)、采用Serializable实现传递值对象

首先修改User.java,使之接口于Serializable,代码如下:

package edu.fred.hqu.androidactivitysendargs;

import java.io.Serializable;

/**
 * Created by Fred on 2015/8/27.
 */
public class User implements Serializable{

    //成员
    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;
    }
}

其次修改MainActivity.java,加入要传递的值对象,代码如下:

//传递值对象方法1:Serializable
i.putExtra("user",new User("Fred",18));
startActivity(i);

接着修改TheAty.java,接收传递过来的值对象,代码如下:

//获取传递的值对象方法1
Intent i = getIntent();
tv = (TextView) findViewById(R.id.tv);
User user = (User) i.getSerializableExtra("user");
tv.setText(String.format("User info(name=%s,name=%d)",user.getName(),user.getAge()));

最后编译运行,给出实验结果如下图所示:


3)、采用Parcelable实现传递值对象

首先修改User.java,使之接口于Parcelable,代码如下:

package edu.fred.hqu.androidactivitysendargs;

import android.os.Parcel;
import android.os.Parcelable;

import java.io.Serializable;

/**
 * Created by Fred on 2015/8/27.
 */
//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;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(getName());
        dest.writeInt(getAge());
    }

    public static final  Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel source) {
            //若是多个同类型的,可以采用source.writeBundle();实现
            return new User(source.readString(),source.readInt());
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

}

接着只需要修改TheAty.java,接收传递过来的值对象,代码如下:

//获取传递的值对象方法2
Intent i = getIntent();
tv = (TextView) findViewById(R.id.tv);
User user = i.getParcelableExtra("user");
tv.setText(String.format("User info(name=%s,name=%d)",user.getName(),user.getAge()));

最后编译运行,测试结果如下图所示:


4)、值对象传递的两种方法SerializableParcelable的比较

Serializable操作简单,但是速度慢;

Parcelable是安卓平台提供的,操作复杂,但是效率高。


4、如何获取 Activity 的返回参数


如何获取 Activity 的返回参数,即如何获取被启动Activity 传回的参数。

1)、在第二个Activity中加入按钮和待返回的参数

首先进入activity_the_aty.xml,将RelativeLayout换成LinearLayout(原因将在后续的博文中讲到),同时指明orientationvertical,接着进入Design模式,拖入一个文本“Plain Text”和一个按钮“Button”,使得我们后面实现的功能是点击按钮,发送EditText中的数据到第一个Activity中去。示例代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="edu.fred.hqu.androidactivitysendargs.TheAty">

    <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/tv"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send Back"
        android:id="@+id/button" />

</LinearLayout>

2)、在第一个Activity中加入一个“Plain TextView”,用于呈现返回参数的结果

首先进入activity_main.xml,将RelativeLayout换成LinearLayout(原因将在后续的博文中讲到),同时指明orientationvertical,接着进入Design模式,拖进去一个“Plain TextView”,用于呈现结果,对应的示例代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnStartAty"
        android:text="启动另一个Activity" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/textView"/>


</LinearLayout>

3)、进入MainActivity.java中设置textView,并指定按钮动作,并显示出返回参数的数据,加入的代码如下:

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

startActivity(i);修改为startActivityForResult(i,0);,最后加入onActivityResult,完整的代码如下:

package edu.fred.hqu.androidactivitysendargs;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
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);

        //用Intent传递参数
        findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,TheAty.class);

               //传递简单数据
//                i.putExtra("data","Activity send args,Fred,Hello!");
//                startActivity(i);

                //传递包Bundle方法1
//                Bundle b = new Bundle();
//                b.putString("name","传递测试");
//                b.putInt("age",2);
//                b.putString("name1","Fred");
//                i.putExtras(b);
//                startActivity(i);

                //传递包Bundle方法2
//                Bundle b = new Bundle();
//                b.putString("name","传递测试");
//                b.putInt("age",2);
//                b.putString("name1","Fred");
//                i.putExtra("data",b);
//                startActivity(i);

                //传递值对象方法1:Serializable(简单但效率低)
//                i.putExtra("user",new User("Fred",18));
//                startActivity(i);

                //传递值对象方法2:Parcelable(复杂但高效)
                i.putExtra("user",new User("Fred",18));
//                startActivity(i);

                //获取Activity的返回参数
                startActivityForResult(i,0);

            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

4)、进入TheAty.java中设置功能为写入返回的参数数据(可编辑的),对应的代码如下:

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

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

        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(1,i);
                finish();
            }
        });

5)、测试结果


点击“启动另一个Activity”后出现界面:


输入Fred


点击send back最后得到返回的数据如下图:


可以看出完全验证了我们的想法!!!!羡慕


目录
相关文章
|
3月前
|
Android开发 开发者
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
41 1
|
3月前
|
数据库 Android开发 开发者
Android基础知识:请解释Activity的生命周期。
Android基础知识:请解释Activity的生命周期。
41 2
|
6月前
|
存储 SQL 人工智能
Android Activity启动流程一:从Intent到Activity创建
Android Activity启动流程一:从Intent到Activity创建
|
2月前
|
Android开发
[Android 四大组件] --- Activity
[Android 四大组件] --- Activity
22 1
|
3月前
|
Android开发
Android基础知识:什么是Fragment?与Activity的区别是什么?
Android基础知识:什么是Fragment?与Activity的区别是什么?
271 54
|
4月前
|
XML 安全 Java
Android Studio App开发入门之活动Activity中为活动补充附加信息讲解及实战(附源码 超详细必看)
Android Studio App开发入门之活动Activity中为活动补充附加信息讲解及实战(附源码 超详细必看)
35 0
|
4月前
|
Android开发
Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
43 0
|
4月前
|
Android开发
Android Studio APP开发入门之活动Activity中启停活动页面的讲解及实战(附源码,包括Activity的启动结束、生命周期、跳转等)
Android Studio APP开发入门之活动Activity中启停活动页面的讲解及实战(附源码,包括Activity的启动结束、生命周期、跳转等)
41 0
|
5月前
|
Android开发
安卓activity管理器
安卓activity管理器
27 0
|
6月前
|
SQL 人工智能 Java
Android Activity 启动流程 二:setContentView
Android Activity 启动流程 二:setContentView