android - Parcelable 示例出错。

标签 android parcelable

有人建议我为我的 android 类项目使用 parcelable。在我将它实现到我的代码中之前,我想对它有一个实际的了解。我很难让这个例子工作,我已经列出了程序运行时的错误

 **Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.shawn.nichol.parcelabletest.Person.toString()' on a null object reference
    atcom.shawn.nichol.parcelabletest.SecondActivity.onCreate(SecondActivity.java:20**)

如有任何帮助,我将不胜感激,我已经在这里工作了 10 个小时。

主 Activity

public class MainActivity extends AppCompatActivity {

    static String NAME_KEY = "NAME;";
    static String AGE_KEY = "AGE";
    static String USER_KEY = "USER";
    static String PERSON_KEY = "PERSON";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(MainActivity.this, SecondActivity.class);

        intent.putExtra(PERSON_KEY, new Person("Alice Smith",  25.0, 
        "Calgary"));

        startActivity(intent);
    }
}

人(可包裹)

public class Person implements Parcelable {
    String name;
    Double age;
    String city;

    public Person(String name, double age, String city) {
        this.name = name;
        this.age = age;
        this.city = city;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", city='" + city + '\'' +
                '}';
    }

    protected Person(Parcel in) {
        this.name = in.readString();
        this.age = in.readDouble();
        this.city = in.readString();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel parcel) {
            return null;
        }

        @Override
        public Person[] newArray(int i) {
            return new Person[0];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(this.name);
        parcel.writeDouble(this.age);
        parcel.writeString(this.city);
    }

第二个 Activity

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Intent i = getIntent();
        Person person = 
             getIntent().getExtras().getParcelable(MainActivity.PERSON_KEY);

        if(getIntent() != null && getIntent().getExtras() != null) {

            Log.d("Nichol", "Second activity " + person.toString());
        }
    }
}

最佳答案

在你的情况下,问题出在你的创造者身上

public static final Creator<Person> CREATOR = new Creator<Person>() {
     @Override
     public Person createFromParcel(Parcel parcel) {
         return null;
     }
     ...
}

当您的 parcelable 加载您的 Person 时,它会调用您的 Creator - 返回一个 null person。你需要返回一个对象

public Person createFromParcel(Parcel parcel) {
     return new Person(parcel);
}

关于android - Parcelable 示例出错。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52682094/

相关文章:

android - 如何压缩和解压缩文件?

java - Parcelable 对象错误 : Unmarshalling unknown type code *** at offset ***

android - 使用 Parcelable 而不是序列化对象的好处

android - android中使用的Parcelable和Serialization有什么区别

android - 如何在 Android 中的两个 Activity 之间传递对象列表?

android - 再次打包相同对象时获取解码未知类型代码

android strings.xml japnese 只显示标签中的一系列 block

android - 如何从 whatsapp fileprovider 获取 txt 文件

安卓开发 : Inserting a local image file into a ListView referenced from a SQLite database via a ViewBinder

c# - 如何在 Unity AndroidJavaClass 中访问枚举