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最后得到返回的数据如下图:


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


目录
相关文章
|
17天前
|
存储 XML 开发工具
探索安卓应用开发:从基础到进阶
在这篇文章中,我们将一起踏上安卓应用开发的旅程。不论你是编程新手还是希望提升技能的开发者,这里都有你需要的东西。我们会从最基础的概念开始,逐步深入到更复杂的主题。文章将涵盖开发环境设置、用户界面设计、数据处理以及性能优化等方面。通过理论与实践的结合,你将能够构建出既美观又高效的安卓应用。让我们一起开启这段技术之旅吧!
|
24天前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
7天前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
|
21天前
|
缓存 监控 前端开发
探索Android应用开发之旅:从新手到专家
【10月更文挑战第42天】本文将带你踏上Android应用开发的旅程,无论你是初学者还是有经验的开发者。我们将一起探索如何从零开始创建你的第一个Android应用,并逐步深入到更高级的主题,如自定义视图、网络编程和性能优化。通过实际示例和清晰的解释,你将学会如何构建高效、吸引人的Android应用。让我们一起开启这段激动人心的旅程吧!
|
21天前
|
开发框架 前端开发 Android开发
探索安卓和iOS应用开发中的跨平台解决方案
【10月更文挑战第42天】在移动应用开发的广阔天地中,安卓和iOS系统如同两座巍峨的山峰,分别占据着半壁江山。开发者们在这两座山峰之间穿梭,努力寻找一种既能节省资源又能提高效率的跨平台开发方案。本文将带你走进跨平台开发的世界,探讨各种解决方案的优势与局限,并分享一些实用的代码示例,助你在应用开发的道路上更加游刃有余。
|
1月前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
1月前
|
Android开发 Swift iOS开发
探索iOS与安卓应用开发的差异性
探索iOS与安卓应用开发的差异性
47 2
|
1月前
|
传感器 XML IDE
探索安卓应用开发:从基础到进阶
【10月更文挑战第23天】在数字化时代的浪潮中,移动应用已成为人们日常生活的延伸。本文以安卓平台为例,深入浅出地介绍了如何从零开始构建一个安卓应用,涵盖了开发环境搭建、基本组件使用、界面设计原则以及进阶技巧等关键步骤。通过实例演示和代码片段,引导读者逐步掌握安卓应用开发的核心技能,旨在激发更多开发者对安卓平台的探索热情,并为初学者提供一条清晰的学习路径。
|
28天前
|
前端开发 Android开发 UED
安卓应用开发中的自定义控件实践
【10月更文挑战第35天】在移动应用开发中,自定义控件是提升用户体验、增强界面表现力的重要手段。本文将通过一个安卓自定义控件的创建过程,展示如何从零开始构建一个具有交互功能的自定义视图。我们将探索关键概念和步骤,包括继承View类、处理测量与布局、绘制以及事件处理。最终,我们将实现一个简单的圆形进度条,并分析其性能优化。
|
1月前
|
开发工具 Android开发 Swift
探索iOS与安卓应用开发的异同点
【10月更文挑战第24天】本文通过比较iOS和安卓开发环境,旨在揭示两大移动平台在开发过程中的相似性与差异性。我们将探讨开发工具、编程语言、用户界面设计、性能优化及市场分布等方面,以期为开发者提供全面的视角。通过深入浅出的分析,文章将帮助读者更好地理解每个平台的独特之处及其对应用开发的影响。