You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:46:31