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

本文介绍如何在Activity之间传递参数,该参数包括简单数据、包Bundle(提供2种方法,即有和无Bundle的两种方法)、值对象(提供2种方法,即Serializable和Parcelable的两种方法),最后介绍如何获取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命名为TheAty,Android 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)、值对象传递的两种方法Serializable和Parcelable的比较

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

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

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

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

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

首先进入activity_the_aty.xml,将RelativeLayout换成LinearLayout(原因将在后续的博文中讲到),同时指明orientation为vertical,接着进入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(原因将在后续的博文中讲到),同时指明orientation为vertical,接着进入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,最后得到返回的数据如下图:

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

时间: 2024-11-03 21:27:41

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

android-Android开发不能够完成Activity之间的跳转

问题描述 Android开发不能够完成Activity之间的跳转 class BackButton implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub Intent backintent=new Intent(); backintent.setClass(LoginOrRegister.this,MainScreen.class); backi

Android基于Intent实现Activity之间数据传递的方法_Android

本文实例讲述了Android基于Intent实现Activity之间数据传递的方法.分享给大家供大家参考,具体如下: MainActivity: package com.test.intentdemo; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.Menu; import andro

事件-android surfaceview 和activity之间数据传递

问题描述 android surfaceview 和activity之间数据传递 想实现一个功能 就是在mainActivity中放置一个surfaceview和一个Textview 在surfaceview中添加点击onTouch事件 每次点击 让自己定义的surfaceview的变量 step加一 并时时在mainActivity的TextView中更新step的显示 不知道问题有没有描述清楚 就是想在一个view中时时显示另外一个view中定义的变量 解决方案 public class M

activity-在 Activity 之间如何传递 LinkedHashMap?

问题描述 在 Activity 之间如何传递 LinkedHashMap? 我想在activities 之间传递 LinkedHashMap,代码如下:Activity A LinkedHashMap mLinkedHashMap = new LinkedHashMap<String Object>();// setting data in mapBundle bundle = new Bundle();bundle.putSerializable(""OBJECTS_LI

mobile-servlet与servlet之间如何传递参数与获取响应

问题描述 servlet与servlet之间如何传递参数与获取响应 现在已知servlet1从a.jsp页面中获得参数,并把参数发送给接口地址:http://pay.soopay.net/spay/pay/payservice.do.并从该接口获取返回的数据串儿(类似于url的字符数据) 如: http://localhost:8080/UmpDemo_WangYinZhiLian_JAVA/jsp/V4.0/getPlatNotifyData_2.jsp?amount=1&amt_type=R

WPF浏览器应用程序中页面与页面之间如何传递参数

问题描述 WPF浏览器应用程序中页面与页面之间如何传递参数,以前写应和程序的时候比如:datatabledt=newdatatable();Awindowaw=newAwindow(dt);aw.show();可以通过窗体的构造函数传递参数至下一个窗体,在WPF浏览器应用程序中转至下一页时怎样把参数传递下去? 解决方案 解决方案二: 解决方案三:如何要传一个datatable有什么办法?解决方案四:如果要在两个页面之前传递一个DataTable用什么办法?解决方案五:接受DataTable的页面

Android 学习之路一:Activity之间传递数据的四种方式

传递数据 新建 Activity 在项目中右键,选择 New,继续选择中下方的 Activity,最后是 Blank Activity. 此时 Android Studio 会为我们自动添加一个对应的布局文件,为布局文件中的 TextView 添加 ID,以便后续使用. 用Intent 发送数据 在主布局文件中新建一个 Button 控件,并在主类中定义它,然后为它设置 Click 的监听事件. Button button; @Override protected void onCreate(B

详解Android Activity之间切换传递数据的方法_Android

前面照着android系统的裁剪图片的功能自己写了一个相似的工具.功能是大体上实现了,但留下了一个调用的问题:如何从我的程序调用这个裁剪工具,并且获得裁剪后的图片呢? 其实这个也很简单了,就是intent的基础用法. 先上个图(界面依旧没优化,难看就难看吧): 起始activity,打开图片选择窗口,随便选择一张图片 下面是跳转到裁剪界面 按下crop按钮,退出activity,回到原来界面,并显示裁剪后的图 流程就是这样,也算模拟了系统裁剪功能的整体过程.下面就是实现功能的关键代码和说明了.

详解Android Activity之间切换传递数据的方法

前面照着android系统的裁剪图片的功能自己写了一个相似的工具.功能是大体上实现了,但留下了一个调用的问题:如何从我的程序调用这个裁剪工具,并且获得裁剪后的图片呢? 其实这个也很简单了,就是intent的基础用法. 先上个图(界面依旧没优化,难看就难看吧): 起始activity,打开图片选择窗口,随便选择一张图片 下面是跳转到裁剪界面 按下crop按钮,退出activity,回到原来界面,并显示裁剪后的图 流程就是这样,也算模拟了系统裁剪功能的整体过程.下面就是实现功能的关键代码和说明了.