可包裹的例子出错了。

时间:2018-10-06 18:23:13

标签: 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个小时。

MainActivity

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);
    }

}

SecondActivity

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());
        }
    }
}

2 个答案:

答案 0 :(得分:2)

问题在于您的创作者

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

当您的包裹装入您的Person时,它将调用您的创建者-返回一个空人员。您需要返回一个对象

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

答案 1 :(得分:0)

您的可打包Creator实现是错误的。试试这个:

public class Person implements Parcelable, 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) {
        name = in.readString();
        age = in.readByte() == 0x00 ? null : in.readDouble();
        city = in.readString();
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        if (age == null) {
            dest.writeByte((byte) (0x00));
        } else {
            dest.writeByte((byte) (0x01));
            dest.writeDouble(age);
        }
        dest.writeString(city);
    }

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

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