有人建议我在我的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个小时。
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);
}
}
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());
}
}
}
答案 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];
}
};
}