码迷,mamicode.com
首页 > 其他好文 > 详细

Activity之间传递参数

时间:2015-07-09 21:27:54      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

Activity之间的数据传递

1传递简单数据

2传递数据包(Bundle)

3传递值对象

4获取Activity的返回参数

 

 

 

1------传递简单的数据

新建android工程,取名SendArgs,在activity_main.xml文件里添加一个按钮,用于启动另一个Activity,然后新建一个Activity(手动建class再extends Activity的,需要在AndroidManifest.xml文件里添加配置信息,建议直接新建android activity),取名Aty。

在MainActivity.java文件里修改onCreate函数

@Override

         protected void onCreate(Bundle savedInstanceState) {

                   super.onCreate(savedInstanceState);

                   setContentView(R.layout.activity_main);

                  

                   findViewById(R.id.btStartAty).setOnClickListener(new OnClickListener() {

                            @Override

                            public void onClick(View arg0) {

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

                                     startActivity(i);

                            }

                   });

         }

以上为点击按钮,可跳转至另一个activity的代码,若要传递参数,则需在Intent i = new Intent(MainActivity.this,Aty.class);后添加代码:i.putExtra(“data”,”请叫我小志”);

然后在Aty.java文件中的onCreate方法中获取这个Extra,添加如下代码:

Intent i = getIntent();

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

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

 

2------传递数据包(Bundle)

在MainActivity.java中修改代码

将i.putExtra(“data”,”请叫我小志”);修改为:

Bundle b = new Bundle();

b.putString("name", "小志");

b.putInt("age", 18);//bundle可以嵌套bundle

i.putExtras(b);//注意是putExtras(),不是putExtra()

然后再Aty.java文件里获取该Extra

Intent i = getIntent();

Bundle b = i.getExtras();

将tv.seText换为:

//name1不存在的话,默认值是aaa(自己定义),如果有值的话,就是该值

tv.setText(String.format("name=%s,age=%d,name1=%s",b.getString("name"),b.getInt("age"),b.getString("name1","aaa") ));

还有一种传递方式是i.putExtra("data", b);

此时Aty.java的获取方式是:

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

 

3------传递值对象(自定义数据类型)

在src同包下创建User类,两个属性string name 和 int age 加上set/get和带参构造

然后再MainActivity中修改按钮的响应函数:

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

i.putExtra("user", new User("小志",24));

写第二句的时候会提示出错,错误提示信息需要序列化,有两种方式第一种User类实现Serializable(java.io.Serializable)效率低,第二种是android.os.Parcelable 效率高

先看第一种:public class User implements Serializable

然后就可以在Aty里获取

Intent i = getIntent();

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

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

(之前声明tv的语句不能在setContentView(R.layout.activity_aty);之上)

第二种方式:public class User implements Parcelable

需实现两个函数

@Override

public int describeContents() {

              return 0;

}

在第二个函数里添加代码:

@Override

public void writeToParcel(Parcel dest, int flag) {

       //Parcelable没有全自动化的序列化机制,需要手动添加

       dest.writeString(getName());

       dest.writeInt(getAge());

}

还需要添加一个静态常量:

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

 

                   @Override

                   public User createFromParcel(Parcel source) {

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

                   }

 

                   @Override

                   public User[] newArray(int size) {

                            return new User[size];

                   }

         };

在Aty中获取也需要用Parcelable

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

4------获取Activity的返回参数 

开启activity有两种方式

1.startActivity(intent)   如上述各例子

2.startActivityForResult(intent,requestCode);

onActivityResult(int requestCode,int resultCode,Intent data)

setResult(resultCode,data);

 

第二种方式可以将第二个页面的数据回传

第一个activity.java里:

Intent intent = new Intent(MainActivity.this,SecondActivity.class);

 

startActivityForResult(intent,1);

第二个参数是请求的一个标识,程序若启动多个activity,则可通过该标识判断是哪个activity返回的,而且需重写onActivityResult方法,如下代码:

/*

        * 通过startActivityForResult跳转,接收返回的数据的方法

        * requestCode:请求的标识

        * resultCode: 第二个页面返回的标识

        * data:第二个页面回传的数据

        */

       @Override

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

              super.onActivityResult(requestCode, resultCode, data);

              if(requestCode==1&&resultCode==2){

                     String content = data.getStringExtra("data");

                     tv.setText(content);

              }

       }

第二个页面中的按钮的响应函数改为:

Intent data = new Intent();    

data.putExtra("data", “你好”);

setResult(2, data);

//结束当前页面

finish();

Activity之间传递参数

标签:

原文地址:http://www.cnblogs.com/QuietZhi/p/4634212.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!