发这篇博客主要讲一下Android中Intent中如何传值的几种方法:
1:基本数据类型,包含了Java八种基本数据类型和CharSequece文本
2:八种数据类新对应数组和CharSequece文本数组
3:Bundle传值
4:ArrayList集合
5:Serializable传递对象
6:Parcelable传递对象
在 main.xml 布局文件中添加六个Button控件,分别是六种传值方式。
Activity代码如下:
package com.example.transmittingdata; import java.util.ArrayList; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; /*** * * Intent传值包含 * 1:基本数据类型,包含了Java八种基本数据类型和CharSequece文本 * 2:八种数据类新对应数组和CharSequece文本数组 * 3:Bundle * 4:ArrayList集合 5:Serializable传递对象 * 6:Parcelable传递对象 * * @author zq * */ public class MainActivity extends Activity implements OnClickListener { private String[] str = new String[] { "八种数据类新对应数组和CharSequece文本数组", "123" }; private ArrayList<String> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initView(); } private void initView() { // TODO Auto-generated method stub findViewById(R.id.button1).setOnClickListener(this); findViewById(R.id.button2).setOnClickListener(this); findViewById(R.id.button3).setOnClickListener(this); findViewById(R.id.button4).setOnClickListener(this); findViewById(R.id.button5).setOnClickListener(this); findViewById(R.id.button6).setOnClickListener(this); list = new ArrayList<String>(); list.add("List集合"); list.add("Value"); } @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this, IntentData.class); switch (v.getId()) { case R.id.button1: intent.putExtra("i", 1); intent.putExtra("key", "基本数据类型,包含了Java八种基本数据类型和CharSequece文本"); break; case R.id.button2: intent.putExtra("i", 2); intent.putExtra("key", str); break; case R.id.button3: Bundle bundle = new Bundle(); bundle.putString("key", "Bundle传值"); intent.putExtra("i", 3); intent.putExtra("bundle", bundle); break; case R.id.button4: intent.putExtra("i", 4); intent.putStringArrayListExtra("key", list); break; case R.id.button5: UserInfo user = new UserInfo(); user.setSex("男"); user.setUserName("白子画"); intent.putExtra("i", 5); intent.putExtra("key", user); break; case R.id.button6: intent.putExtra("i", 6); UserBean userBean = new UserBean(); userBean.setSex("女"); userBean.setUserName("花千骨"); intent.putExtra("key", userBean); break; default: break; } startActivity(intent); } }
接收值的Activity类:
public class IntentData extends Activity{ private TextView text1, text2; private int position = 1; private String data = ""; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.data); initView(); initData(); } @SuppressLint("NewApi") private void initData() { // TODO Auto-generated method stub if (getIntent() != null) { position = getIntent().getIntExtra("i", 1); if (position == 1) { data = getIntent().getStringExtra("key"); text1.setText("基本数据类型"); text2.setText(data); return; } if (position == 2) { String[] data1 = getIntent().getStringArrayExtra("key"); text1.setText("数组"); text2.setText(data1[0] + "----" + data1[1]); return; } if (position == 3) { Bundle bundle = getIntent().getBundleExtra("bundle"); text1.setText("Bundle"); text2.setText(bundle.getString("key", "默认为空是的值")); return; } if (position == 4) { ArrayList<String> array; text1.setText("List<object> 集合"); array = getIntent().getStringArrayListExtra("key"); text2.setText(array.get(0)); return; } if (position == 5) { UserInfo user; text1.setText("Serializable传递对象"); user = (UserInfo) getIntent().getSerializableExtra("key"); text2.setText(user.getUserName() + "---" + user.getSex()); return; } if (position == 6) { UserBean userBean; text1.setText("Parcelable传递对象"); userBean = (UserBean) getIntent().getParcelableExtra("key"); text2.setText(userBean.getUserName() + "---" + userBean.getSex()); return; } } } private void initView() { // TODO Auto-generated method stub text1 = (TextView) findViewById(R.id.textView1); text2 = (TextView) findViewById(R.id.textView2); } }
Serializable传递对象
Serializable:是序列化的意思,表示将一个对象转换成可储存或可传输的状态,对象进行Serializable序列化之后就可以通过Intent来进行Activity之间的传输了。
public class UserInfo implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String sex; private String userName; publicUserInfo(){ // TODO Auto-generated constructor stub } public String getSex(){ return sex; } publicvoidsetSex(String sex){ this.sex = sex; } public String getUserName(){ return userName; } publicvoidsetUserName(String userName){ this.userName = userName; } }
这里面的serialVersionUID需要注意一下,它的作用是序列化和反序列化时保持版本的兼容性,如果你未指定,运行时也会默认生成,在进行反序列化时只有数据和当前类的serialVersionUID相同是才能够正常的反序列化,你不指定serialVersionUID一般情况下也不会出问题,但是如果当前类发生了改变例如删掉了某个成员变量那么当前类的serialVersionUID也会出现改变,之后你对数据进行反序列化就会出现错误,这里我指定为1L,L为Long数据类型。
Parcelable传递对象
Parcelable的序列化原理是将一个对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,因此实现了传递对象的功能。
public class UserBean implements Parcelable { private String sex; private String userName; public UserBean() { // TODO Auto-generated constructor stub } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub dest.writeString(userName); dest.writeString(sex); } protected UserBean(Parcel in) { userName = in.readString(); sex = in.readString(); } public static final Creator<UserBean> CREATOR = new Creator<UserBean>() { @Override public UserBean createFromParcel(Parcel in) { return new UserBean(in); } @Override public UserBean[] newArray(int size) { return new UserBean[size]; } }; }
可以看到通过Parcelable的实现方式是要复杂很多的,实现Parcelable接口后,需要重写writeToParcel和describeContents方法,describeContents方法直接返回0就可以了,writeToParcel方法我们需要调用Parcel对象进行数据写入,例如dest.writeString(name),注意如果name是字符串类型就调用writeString,如果是Int类型就调用writeInt 等等。
相关推荐
在Activity与Fragment之间进行传值主要有以下几种方法: 1. **通过Intent传递数据**: - 如果从Activity启动一个新的Fragment,我们可以通过Intent将数据传递给Fragment。在创建Fragment实例时,可以使用Bundle...
在“Intent传值”中,我们通常会用到以下几种方法: 1. 使用putExtra()和getExtra(): 这是最常用的方法,可以传递基本数据类型(如int、String、float等)以及Parcelable或Serializable接口的实现类。例如,要在...
"Activity间传值"指的是在不同的Activity实例之间共享数据。在这个场景中,我们有Activity1、Activity2和Activity3,涉及到了一个典型的Activity启动流程:Activity1启动Activity2,Activity2再启动Activity3,最后...
接着,我们探讨数据传递的几种方式: 1. **Intent**:虽然Intent主要用于Activity之间的数据传递,但也可以用在PopupWindow与Activity之间。例如,当用户在PopupWindow中做出选择后,可以通过Intent将数据传回...
标题"android 传值回调"主要涉及的是在Android应用程序的不同Activity之间传递数据以及使用回调方法来处理这些数据的方式。本篇文章将详细探讨Android页面传值的各种策略和技术。 首先,最基本的页面传值方式是使用...
下面我们将深入探讨页面传值的几种主要方法。 首先,最基本的页面传值方式是通过Intent。Intent在Android中是一种用于启动新的Activity或服务的机制,同时也可用于在它们之间传递数据。当你启动一个新的Activity时...
要实现在Fragment和Activity之间的通信,通常有以下几种方式: 1. **Intent**:虽然Intent主要用于Activity之间的通信,但也可以用在Fragment向Activity传递数据,只需通过`getActivity().startActivityForResult()...
在Android应用开发中,Fragment是Activity...以上就是Fragment间传递数据的几种常用方法,每种方法都有其适用场景。开发者应根据实际需求选择合适的方式。在实际开发中,注意数据安全和性能优化,避免内存泄漏等问题。
在Android中,通常有以下几种方式: 1. **通过putExtra()和getExtra()方法**:在创建Intent时,可以使用`putExtra(String name, Parcelable value)`将数据作为额外参数添加到Intent中。在接收端,使用`getExtras()`...
在实际项目中,页面之间传值,除了以上几种,经常还有传递Object对象、List类型、List<Object>类型和全局变量等等的需求。本文就是介绍怎么传递这几种类型的参数。 一、传递List和List 以下以传递List为例,...
那么,Intent传值与Bundle传值的主要区别体现在以下几个方面: 1. **数据容量**:Intent本身能携带的数据量有限,如果数据过大,可能会导致Intent过大而引发异常。相比之下,Bundle没有这个限制,因为它只是数据的...
数据传递到`ViewPager`的各个`Fragment`,可以有以下几种方式: 1. 在`FragmentPagerAdapter`的`instantiateItem()`方法中,将数据作为参数传给创建的`Fragment`实例。 2. 通过`Bundle`在`Fragment`的构造函数或者`...
下面列出几种Intent的用法显示网页: 代码如下:Uri uri = Uri.parse(“http://www.google.com”);Intent it = new Intent(Intent.ACTION_VIEW,uri);startActivity(it);显示地图: 代码如下:Uri uri
Intent主要有以下几种重要用途: 1. 启动Activity:可以将Intent对象传递给startActivity()方法或startActivityForResult()方法以启动一个Activity,该Intent对象包含了要启动的Activity的信息及其他必要的数据。 2...
- **2.1.6 Intent对象调用Activity实例**:进一步阐述了Intent如何作为“消息”,用于在不同的Activity之间进行通信。 - **2.1.7 Activity透明**:教授了如何设置Activity的透明度,从而实现视觉上的叠加效果。 -...
- **Intent** 被用于在Activity和Service之间传递数据或启动它们。 #### 21. 请描述一下BroadcastReceiver。 **BroadcastReceiver** 用于接收来自系统和其他应用程序的广播消息。它可以监听特定的事件,例如电池...
Activity之间的跳转通常通过Intent对象实现。Intent不仅可以启动新的Activity,还可以传递数据给新Activity。例如,使用`putExtra()`方法将数据封装到Intent中,然后通过`startActivity()`启动目标Activity。 ```...
Android 中的数据共享是指在不同的 Activity 或 Fragment 之间实现数据的共享和交互。传统的实现方式是通过 Intent 传递数据,但这种方式有其局限性,例如无法实现实时数据共享和无法共享大量数据。为了解决这些...