Android中的Activity之间传递自定义类型的List的方法
16lz
2021-01-24
一、传递自定义类型
当Activity之间进行通信时,我们通常会遇到传递自定义类型,正如我们所知,自定义类型是无法直接通过Android中的Intent进行传递的,这时,我们可以采取将自定义类型实现Parcelable接口,并使用Intent的putExtras来进行传递。
public void writeToParcel(Parcel dest, int flags);
public int describeContents();
并且此类一定要包含一个静态的CREATOR(见代码)
如果这个类还包含一个自定义类型的对象,那么这个自定义的类型也应当实现Parcelable接口。
当Activity之间进行通信时,我们通常会遇到传递自定义类型,正如我们所知,自定义类型是无法直接通过Android中的Intent进行传递的,这时,我们可以采取将自定义类型实现Parcelable接口,并使用Intent的putExtras来进行传递。
以下是本人的一个数据类的实例:
public class UserData implements Parcelable{ private String username; private String password; private String Email; private boolean logined; public UserData() { this.username = ""; this.password = ""; this.Email = ""; this.logined = false; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(username); dest.writeString(password); dest.writeString(Email); } public UserData(String username, String password, String Email) { this.username = username; this.password = password; this.Email = ""; this.logined = false; } public UserData(Parcel in) { username = in.readString(); password = in.readString(); Email = in.readString(); } public static final Creator CREATOR = new Creator() { @Override public UserData createFromParcel(Parcel in) { return new UserData(in); } @Override public UserData[] newArray(int size) { return new UserData[size]; } }; @Override public int describeContents() { return 0; } public String getUsername() { return this.username; } public String getPassword() { return this.password; } public void setLoginStatus(boolean status) { this.logined = status; } public boolean isLogined() { return this.logined; } public void setUsername( String username ) { this.username = username; } public void setPassword( String password ) { this.password = password; } public void setEmail( String email ) { this.Email = email; } @Override public String toString() { return "User{" + "name='" + username + '\'' + ", password='" + password + '\'' + ", Email='" + Email + '\'' + '}'; }}
注意在实现接口时,一定要实现 public void writeToParcel(Parcel dest, int flags);
public int describeContents();
并且此类一定要包含一个静态的CREATOR(见代码)
如果这个类还包含一个自定义类型的对象,那么这个自定义的类型也应当实现Parcelable接口。
并且,在writeToParcel这个函数中使用writeParcelable方法来写入Parcel,在获取Parcel中的对象时(见代码的
public UserData(Parcel in) 构造函数),要使用readParcelable读取.
二、传递List的自定义类型
传递List的自定义类型与上方类似,只是在写入Parcel和读取时有所不同
本人有一个小小的实例,这是一个包含两个类型的例子:
Tag.java
public class Tag implements Parcelable{ private String tag_name; private String tag_num; private String tag_url; public List articles = new ArrayList<>(); @Override public void writeToParcel( Parcel dest, int flags ) { dest.writeString(this.getTag_name()); dest.writeString(this.getTag_num()); dest.writeString(this.getTag_url()); dest.writeTypedArray( this.getArticles().toArray(new Article[this.getArticles().size()]), flags ); } public Tag() { this.tag_url = ""; this.tag_name = ""; this.tag_num = ""; } public Tag( String _tag_name, String _tag_num, String _tag_url) { this.tag_name = _tag_name; this.tag_num = _tag_num; this.tag_url = _tag_url; } public Tag( Parcel parcel ) { this.tag_name = parcel.readString(); this.tag_num = parcel.readString(); this.tag_url = parcel.readString(); // Article[] temp = parcel.readParcelableArray(Article.class.getClassLoader()); Article[] temp = parcel.createTypedArray(Article.CREATOR); this.articles = Arrays.asList(temp); } public static final Creator CREATOR = new Creator() { @Override public Tag createFromParcel(Parcel parcel) { return new Tag(parcel); } @Override public Tag[] newArray(int size) { return new Tag[size]; } }; @Override public int describeContents() { return 0; } public void setTag_name( String name ) { this.tag_name = name; } public void setTag_num( String num ) { this.tag_num = tag_num; } public void setTag_url( String url ) { this.tag_url = url; } public String getTag_name() { return this.tag_name; } public String getTag_num() { return this.tag_num; } public String getTag_url() { return this.tag_url; } public List getArticles() { return articles; } public void setArticles(List articles) { this.articles = articles; } @Override public String toString() { String article = ""; for (int i = 0; i < articles.size(); ++i) { article += articles.get(i).toString() + "\n"; } return " : " + this.tag_num + " : " + this.tag_url + "\n" + article; }}
Article.java
public class Article implements Parcelable{ private String title; private String url; private String date; private String publisher; @Override public void writeToParcel(Parcel dest, int flags){ dest.writeString(this.title); dest.writeString(this.url); } public Article() { this.title = ""; this.url = ""; } public Article(String _title, String _content) { this.title = _title; this.url = _content; } public Article( Parcel parcel ) { this.title = parcel.readString(); this.url = parcel.readString(); } public static final Creator CREATOR = new Creator() { @Override public Article createFromParcel(Parcel parcel) { return new Article(parcel); } @Override public Article[] newArray(int size) { return new Article[size]; } }; @Override public int describeContents() { return 0; } public void setTitle(String title) { this.title = title; } public String getTitle() { return title; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getPublisher() { return publisher; } public void setPublisher(String publisher) { this.publisher = publisher; } @Override public String toString() { return this.url; }}
更多相关文章
- C语言函数的递归(上)
- Android(安卓)NDK编程:数字转string
- android中的常见类(二)
- android jni 的编写二 (NDK 开发中动态注册Jni)
- AIDL入门
- [原]Android应用程序绑定服务(bindService)的过程源代码分析
- 还在用枚举?我早就抛弃了!(Android(安卓)注解详解)
- 深入了解android平台的jni(一)
- Android(安卓)NFC源码浅析