Android中通过Intent传递Parcelable对象失败问题求助
嘿,作为Android新手遇到Parcelable的坑太正常啦!我看你给出的User类代码没写完,大概率是Parcelable的核心实现步骤没做全,才导致写入功能失效。我来给你梳理正确的实现方式,帮你解决这个问题~
修复Parcelable实现的正确步骤
Parcelable的核心是把对象数据写入Parcel和从Parcel重建对象这两个环节,少了任何一步或者顺序出错都会出问题。
1. 补全User类的完整Parcelable实现
我把完整的User类代码写出来,你可以对照自己的代码修改:
public class User implements Parcelable { // 成员参数 private String name; private String surname; private String email; private String number; private String username; private String Uid; // 普通构造方法(保留你原来的Firebase构造) public User(String name, String surname, String email, String number, String username, String uid) { this.name = name; this.surname = surname; this.email = email; this.number = number; this.username = username; Uid = uid; } // 你原来的Firebase相关构造 public User(final FirebaseUser user, final DatabaseReference reference) { Uid = user.getUid(); // 记得补全这里其他参数的赋值逻辑哦 } // Parcelable必备:从Parcel读取数据的构造方法 protected User(Parcel in) { name = in.readString(); surname = in.readString(); email = in.readString(); number = in.readString(); username = in.readString(); Uid = in.readString(); } // Parcelable必备:CREATOR静态常量(系统用来重建对象) public static final Creator<User> CREATOR = new Creator<User>() { @Override public User createFromParcel(Parcel in) { return new User(in); } @Override public User[] newArray(int size) { return new User[size]; } }; // Parcelable必备:描述内容,一般返回0即可 @Override public int describeContents() { return 0; } // Parcelable必备:写入数据到Parcel的方法 @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(surname); dest.writeString(email); dest.writeString(number); dest.writeString(username); dest.writeString(Uid); } // 别忘了添加getter方法,方便后续获取数据 public String getName() { return name; } public String getSurname() { return surname; } public String getEmail() { return email; } public String getNumber() { return number; } public String getUsername() { return username; } public String getUid() { return Uid; } }
2. 一定要注意的关键细节
- 写入和读取顺序必须完全一致:
writeToParcel里写数据的顺序,要和User(Parcel in)构造方法里读数据的顺序一模一样,不然会出现数据错乱或者读取失败的情况。 - 不要遗漏任何成员变量:所有的成员参数都要在
writeToParcel里写入,同时在Parcel构造里读取,少一个都会导致对应的数据传递失效。 - 必须实现CREATOR常量:这是Parcelable强制要求的,系统需要它来从Parcel中重建对象,没有的话直接会报错。
3. 用Intent传递对象的正确姿势
发送方Activity
// 先创建User对象(或者用你已有的对象) User user = new User("John", "Doe", "john@example.com", "123456", "johndoe", "uid_123"); Intent intent = new Intent(CurrentActivity.this, TargetActivity.class); intent.putExtra("USER_DATA", user); startActivity(intent);
接收方Activity
// Android 12及以上建议用带class参数的方法,兼容性更好 User receivedUser = getIntent().getParcelableExtra("USER_DATA", User.class); // 低版本可以用:User receivedUser = getIntent().getParcelableExtra("USER_DATA");
这样应该就能解决你Parcelable写入失效的问题啦!如果还是不行,可以检查一下自己的构造方法里有没有给成员变量正确赋值——毕竟如果对象本身的数据就是空的,传递过去自然也拿不到内容~
内容的提问来源于stack exchange,提问作者Javid Haji-zada
相关产品推荐
相关产品推荐

