zoukankan      html  css  js  c++  java
  • Intent之对象传递(Parcelable传递对象和对象集合)

    接着上一篇文章,以下我们讨论一下怎样利用Parcelable实现Intent之间对象的传递

    一、实现对象传递

    首先创建User.java实现Parcelable接口:

    package org.yayun.demo;
    
    import java.io.Serializable;
    
    import android.R.integer;
    import android.os.Parcel;
    import android.os.Parcelable;
    
    public class User implements Parcelable {
    	private String name;
    	private int level;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getLevel() {
    		return level;
    	}
    
    	public void setLevel(int level) {
    		this.level = level;
    	}
    
    	public User(String name, int level) {
    		this.name = name;
    		this.level = level;
    	}
    
    	public User() {// 构造方法
    
    	}
    
    	public int describeContents() {// 覆写的方法
    		return 0;
    	}
    
    	public void writeToParcel(Parcel parcel, int flags) {// 覆写的方法
    		parcel.writeString(name);
    		parcel.writeInt(level);
    
    	}
    
    	public static final Parcelable.Creator<User> CREATOR = new Creator<User>() {//必须实现的方法
    		public User createFromParcel(Parcel source) {
    			User user = new User();
    			user.name = source.readString();
    			user.level = source.readInt();
    			return user;
    		}
    
    		public User[] newArray(int size) {
    			return new User[size];
    		}
    	};
    
    }
    

    Parcelable.Creator是必需要实现的,否则会报错:

    以下看两个Activity

    1.MainActivity.java

    package org.yayun.demo;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    	private Button button;
    
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState); // 生命周期方法
    		super.setContentView(R.layout.main); // 设置要使用的布局管理器
    		button = (Button) findViewById(R.id.btn);
    		button.setOnClickListener(new OnClickListener() {
    
    			public void onClick(View v) {
    				User user1 = new User("yayun", 7);// 实例化对象
    				Intent intent = new Intent();
    				intent.setClass(MainActivity.this, LoginActivity.class);
    				Bundle bundle = new Bundle();
    				bundle.putParcelable("user", user1);// 序列化
    				intent.putExtras(bundle);// 发送数据
    				startActivity(intent);// 启动intent
    
    			}
    		});
    
    	}
    }

    2.LoginActivity.java:

    package org.yayun.demo;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class LoginActivity extends Activity {
    	private TextView textView;
    	User user;
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState); // 生命周期方法
    		super.setContentView(R.layout.login); // 设置要使用的布局管理器
    		textView = (TextView) findViewById(R.id.text);
    		Intent intent = this.getIntent();
    		user = (User) intent.getParcelableExtra("user");
    		
    		textView.setText("username:" + user.getName() + "用户等级"
    				+ String.valueOf(user.getLevel()));
    
    	}
    }


    3.执行实比例如以下:

    能够看到和实现Serialiable接口一样的结果。



    二、实现对象集合传递

    这里我们仅仅须要修改两个Activity

    1.MainActivity.java:

    package org.yayun.demo;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    	private Button button;
    	List<User> list=new ArrayList<User>();
    
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState); // 生命周期方法
    		super.setContentView(R.layout.main); // 设置要使用的布局管理器
    		button = (Button) findViewById(R.id.btn);
    		button.setOnClickListener(new OnClickListener() {
    
    			public void onClick(View v) {
    				User user1 = new User("yayun", 7);// 实例化对象
    				User user2=new User("feifei",9);
    				list.add(user1);
    				list.add(user2);
    				Intent intent = new Intent();
    				intent.setClass(MainActivity.this, LoginActivity.class);
    				Bundle bundle = new Bundle();
    				bundle.putParcelableArrayList("list",(ArrayList<User>)list);// 序列化,要注意				                  intent.putExtras(bundle);// 发送数据
    				startActivity(intent);// 启动intent
    
    			}
    		});
    
    	}
    }


    2.LoginActivity.java

    package org.yayun.demo;
    
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class LoginActivity extends Activity {
    	private TextView textView;
    	List<User> list;
    	User user2;
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState); // 生命周期方法
    		super.setContentView(R.layout.login); // 设置要使用的布局管理器
    		textView = (TextView) findViewById(R.id.text);
    		Intent intent = this.getIntent();
    		list =  intent.getParcelableArrayListExtra("list");//getParcelableArrayListExtra方法
    		user2=(User)list.get(1);
    		textView.setText("username:" + user2.getName() + "用户等级"
    				+ String.valueOf(user2.getLevel()));
    
    	}
    }


    3.执行实例:

    执行成功!

    最后注意在AndroidManifest.xml文件里配置LoginActivity

    总结

    1.实现Parcelable接口注意覆写几个方法和实现Parcelable.Creator方法;

    2.bundle.putParcelable("user", user1);// 序列化

    3.user = (User) intent.getParcelableExtra("user");//获取对象

    4.bundle.putParcelableArrayList("list",(ArrayList<User>)list);//存入List对象数组

    5.list = intent.getParcelableArrayListExtra("list");//getParcelableArrayListExtra方法获取对象数组

    6.系统好像仅仅提供了List对象数组的传递方法,其它集合怎么传递?希望大牛告知。

    喜欢的朋友点个赞呗。关注一下呗!

    谢谢

  • 相关阅读:
    jstl表达式判断字符or字符串相等的写法
    enctype="multipart/form-data导致request获取不到数据
    Mac下解决mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
    单源文件目录makefile
    默认生成的特殊函数
    为什么说switch比if快
    C++基本内置类型
    补码的原理及其应用
    CSS--浮动与定位
    CSS--字体
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6843015.html
Copyright © 2011-2022 走看看