有人建议我为我的 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/