尝试调用getSerializableExtra()方法(该方法有效)后的Android-NullPointerException
我试图了解Java序列化是如何工作的,因此我试图在我自己的Android应用程序中添加一种可能性,即传输两个字符串(准确地说是名字和姓氏),然后在另一个活动中显示一条简单的“欢迎”消息,其中包含两个字符串。 事情开始变得非常奇怪,因为我实际上设法传输了两个字符串,但是当涉及到显示它们时。。我“失去”它们,我得到一个空点异常 不管怎样,代码如下: MainActivity.java尝试调用getSerializableExtra()方法(该方法有效)后的Android-NullPointerException,android,serialization,nullpointerexception,Android,Serialization,Nullpointerexception,我试图了解Java序列化是如何工作的,因此我试图在我自己的Android应用程序中添加一种可能性,即传输两个字符串(准确地说是名字和姓氏),然后在另一个活动中显示一条简单的“欢迎”消息,其中包含两个字符串。 事情开始变得非常奇怪,因为我实际上设法传输了两个字符串,但是当涉及到显示它们时。。我“失去”它们,我得到一个空点异常 不管怎样,代码如下: MainActivity.java public class MainActivity extends AppCompatActivity {
public class MainActivity extends AppCompatActivity {
private Button personalData;
protected String strUsername;
private boolean isProfileReady;
TextView welcome;
protected SharedPreferences loginData;
SharedPreferences wizardPrefs;
SharedPreferences.Editor wizardEditor;
DataUser userData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
welcome = (TextView) findViewById(R.id.welcome);
personalData = (Button) findViewById(R.id.data);
personalData.setText("Personal Data");
personalData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, WizardActivity.class);
intent.putExtra("profileReady", isProfileReady);
startActivity(intent);
}
});
loginData = getSharedPreferences("UserPrefs", MODE_PRIVATE);
wizardPrefs = this.getSharedPreferences("USERDATA", MODE_PRIVATE);
String value = loginData.getString("Username", null);
welcome.setText("Welcome " + loginData.getString("Username", strUsername) + "!");
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
isProfileReady = true;
personalData.setText("My Profile");
welcome.setText("Welcome " + userData.getStrFName() + " " + userData.getStrLName() + "!");
}
}
}
public class WizardActivity extends AppCompatActivity implements SummaryFragment.Images {
public DataUser userData;
//region Variables
Button go;
WizardOne wizOne;
WizardTwo wizTwo;
WizardThree wizThree;
SummaryFragment summaryFragment;
Bitmap frontBitmap, backBitmap;
SharedPreferences wizardPrefs;
Bundle bundle = new Bundle();
String pathOne, pathTwo;
int currentPage = 1;
public static final String FRONT_BITMAP_KEY = "frontBitmap", BACK_BITMAP_KEY = "backBitmap";
boolean isProfileReady;
//endregion
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
userData = new DatiUtente();
isProfileReady = getIntent().getBooleanExtra("profileReady", false);
Toast.makeText(this, "profileReady : " + isProfileReady, Toast.LENGTH_SHORT).show();
setContentView(R.layout.wizard_layout);
go = (Button) findViewById(R.id.go);
if (isProfileReady) {
currentPage = 4;
go.setText("Home");
wizardPrefs = this.getSharedPreferences("USERDATA", MODE_PRIVATE);
summaryFragment = new SummaryFragment();
summaryFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().add(R.id.activity_layout, summaryFragment).commit();
} else {
wizOne = new WizardOne(userData);
if (savedInstanceState == null)
getSupportFragmentManager().beginTransaction().add(R.id.activity_layout, wizOne).commit();
}
go.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isProfileReady) {
Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();
} else {
nextFragment();
}
}
});
}
public void nextFragment() {
switch (currentPage) {
case 1:
if (wizOne.validate()) {
wizTwo = new WizardTwo();
changeFragment(wizTwo, R.id.activity_layout);
currentPage++;
} else {
Toast.makeText(getApplicationContext(), "Riempire i campi", Toast.LENGTH_SHORT).show();
}
break;
case 2:
if (wizTwo.validate()) {
wizThree = new WizardThree(getApplicationContext());
changeFragment(wizThree, R.id.activity_layout);
currentPage++;
} else {
Toast.makeText(getApplicationContext(), "Riempire i campi", Toast.LENGTH_SHORT).show();
}
break;
case 3:
if (wizThree.validate()) {
bundle.putParcelable("frontBitmap", wizThree.getFrontBitmap());
bundle.putParcelable("backBitmap", wizThree.getBackBitmap());
summaryFragment = new SummaryFragment();
summaryFragment.setArguments(bundle);
go.setText("Home");
changeFragment(summaryFragment, R.id.activity_layout);
currentPage++;
}
break;
case 4:
passImages();
// setResult(RESULT_OK);
Intent intent = new Intent(this, SerializableWelcome.class);
intent.putExtra("dataUser", userData);
startActivity(intent);
// finish();
break;
default:
break;
}
}
public void changeFragment(ValidateFragment f, int resource) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(resource, f);
transaction.addToBackStack(null);
transaction.commit();
}
public Bitmap getFrontBitmap() {
return frontBitmap;
}
public Bitmap getBackBitmap() {
return backBitmap;
}
@Override
public void onBackPressed() {
if (currentPage > 1) {
currentPage--;
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
@Override
public Bundle passImages() {
bundle.getParcelable("frontBitmap");
bundle.getParcelable("backBitmap");
return bundle;
}
}
WizardActivity.java
public class MainActivity extends AppCompatActivity {
private Button personalData;
protected String strUsername;
private boolean isProfileReady;
TextView welcome;
protected SharedPreferences loginData;
SharedPreferences wizardPrefs;
SharedPreferences.Editor wizardEditor;
DataUser userData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
welcome = (TextView) findViewById(R.id.welcome);
personalData = (Button) findViewById(R.id.data);
personalData.setText("Personal Data");
personalData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, WizardActivity.class);
intent.putExtra("profileReady", isProfileReady);
startActivity(intent);
}
});
loginData = getSharedPreferences("UserPrefs", MODE_PRIVATE);
wizardPrefs = this.getSharedPreferences("USERDATA", MODE_PRIVATE);
String value = loginData.getString("Username", null);
welcome.setText("Welcome " + loginData.getString("Username", strUsername) + "!");
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
isProfileReady = true;
personalData.setText("My Profile");
welcome.setText("Welcome " + userData.getStrFName() + " " + userData.getStrLName() + "!");
}
}
}
public class WizardActivity extends AppCompatActivity implements SummaryFragment.Images {
public DataUser userData;
//region Variables
Button go;
WizardOne wizOne;
WizardTwo wizTwo;
WizardThree wizThree;
SummaryFragment summaryFragment;
Bitmap frontBitmap, backBitmap;
SharedPreferences wizardPrefs;
Bundle bundle = new Bundle();
String pathOne, pathTwo;
int currentPage = 1;
public static final String FRONT_BITMAP_KEY = "frontBitmap", BACK_BITMAP_KEY = "backBitmap";
boolean isProfileReady;
//endregion
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
userData = new DatiUtente();
isProfileReady = getIntent().getBooleanExtra("profileReady", false);
Toast.makeText(this, "profileReady : " + isProfileReady, Toast.LENGTH_SHORT).show();
setContentView(R.layout.wizard_layout);
go = (Button) findViewById(R.id.go);
if (isProfileReady) {
currentPage = 4;
go.setText("Home");
wizardPrefs = this.getSharedPreferences("USERDATA", MODE_PRIVATE);
summaryFragment = new SummaryFragment();
summaryFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction().add(R.id.activity_layout, summaryFragment).commit();
} else {
wizOne = new WizardOne(userData);
if (savedInstanceState == null)
getSupportFragmentManager().beginTransaction().add(R.id.activity_layout, wizOne).commit();
}
go.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isProfileReady) {
Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();
} else {
nextFragment();
}
}
});
}
public void nextFragment() {
switch (currentPage) {
case 1:
if (wizOne.validate()) {
wizTwo = new WizardTwo();
changeFragment(wizTwo, R.id.activity_layout);
currentPage++;
} else {
Toast.makeText(getApplicationContext(), "Riempire i campi", Toast.LENGTH_SHORT).show();
}
break;
case 2:
if (wizTwo.validate()) {
wizThree = new WizardThree(getApplicationContext());
changeFragment(wizThree, R.id.activity_layout);
currentPage++;
} else {
Toast.makeText(getApplicationContext(), "Riempire i campi", Toast.LENGTH_SHORT).show();
}
break;
case 3:
if (wizThree.validate()) {
bundle.putParcelable("frontBitmap", wizThree.getFrontBitmap());
bundle.putParcelable("backBitmap", wizThree.getBackBitmap());
summaryFragment = new SummaryFragment();
summaryFragment.setArguments(bundle);
go.setText("Home");
changeFragment(summaryFragment, R.id.activity_layout);
currentPage++;
}
break;
case 4:
passImages();
// setResult(RESULT_OK);
Intent intent = new Intent(this, SerializableWelcome.class);
intent.putExtra("dataUser", userData);
startActivity(intent);
// finish();
break;
default:
break;
}
}
public void changeFragment(ValidateFragment f, int resource) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(resource, f);
transaction.addToBackStack(null);
transaction.commit();
}
public Bitmap getFrontBitmap() {
return frontBitmap;
}
public Bitmap getBackBitmap() {
return backBitmap;
}
@Override
public void onBackPressed() {
if (currentPage > 1) {
currentPage--;
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
@Override
public Bundle passImages() {
bundle.getParcelable("frontBitmap");
bundle.getParcelable("backBitmap");
return bundle;
}
}
SerializableWelcome.java
public class SerializableWelcome extends AppCompatActivity {
TextView showName;
DataUser userData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_services_main);
showName = (TextView) findViewById(R.id.welcomeFromSummary);
Intent intent = getIntent();
if (intent != null) {
userData = (DataUser) intent.getSerializableExtra("dataUser");
}
showName.setText("Welcome " + userData.getStrFName() + " " + userData.getStrLName() + "!");
}
}
DataUser.java
public class DataUser implements Parcelable {
String strFName, strLName, strFisCode, strBirth, strCity, strZip, strProv, strCC, strIban, strMail;
public DataUser(){}
protected DataUser(Parcel in) {
//region in.readString()
strFName = in.readString();
strLName = in.readString();
strFisCode = in.readString();
strBirth = in.readString();
strCity = in.readString();
strZip = in.readString();
strProv = in.readString();
strCC = in.readString();
strIban = in.readString();
strMail = in.readString();
//endregion
}
public static final Creator<DataUser> CREATOR = new Creator<DataUser>() {
@Override
public DataUser createFromParcel(Parcel in) {
return new DataUser(in);
}
@Override
public DataUser[] newArray(int size) {
return new DataUser[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//region dest.writeString()
dest.writeString(strFName);
dest.writeString(strLName);
dest.writeString(strFisCode);
dest.writeString(strBirth);
dest.writeString(strCity);
dest.writeString(strZip);
dest.writeString(strProv);
dest.writeString(strCC);
dest.writeString(strIban);
dest.writeString(strMail);
//endregion
}
//region Getter and Setter
public String getStrFName() {
return strFName;
}
public void setStrFName(String strFName) {
this.strFName = strFName;
}
public String getStrLName() {
return strLName;
}
public void setStrLName(String strLName) {
this.strLName = strLName;
}
public String getStrFisCode() {
return strFisCode;
}
public void setStrFisCode(String strFisCode) {
this.strFisCode = strFisCode;
}
public String getStrBirth() {
return strBirth;
}
public void setStrBirth(String strBirth) {
this.strBirth = strBirth;
}
public String getStrCity() {
return strCity;
}
public void setStrCity(String strCity) {
this.strCity = strCity;
}
public String getStrZip() {
return strZip;
}
public void setStrZip(String strZip) {
this.strZip = strZip;
}
public String getStrProv() {
return strProv;
}
public void setStrProv(String strProv) {
this.strProv = strProv;
}
public String getStrCC() {
return strCC;
}
public void setStrCC(String strCC) {
this.strCC = strCC;
}
public String getStrIban() {
return strIban;
}
public void setStrIban(String strIban) {
this.strIban = strIban;
}
public String getStrMail() {
return strMail;
}
public void setStrMail(String strMail) {
this.strMail = strMail;
}
//endregion
}
公共类DataUser实现可包裹{
字符串strFName、strLName、strficode、strberth、strCity、strZip、strProv、strCC、strIban、strMail;
公共数据用户(){}
受保护的数据用户(包裹中){
//readString()中的区域
strFName=in.readString();
strLName=in.readString();
strficode=in.readString();
strBirth=in.readString();
strCity=in.readString();
strZip=in.readString();
strProv=in.readString();
strc=in.readString();
strIban=in.readString();
strMail=in.readString();
//端区
}
公共静态最终创建者=新创建者(){
@凌驾
公共数据用户createFromParcel(中的地块){
返回新的数据用户(in);
}
@凌驾
公共数据用户[]新数组(整数大小){
返回新的数据用户[大小];
}
};
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
//区域目标写入限制()
目的地记录(strFName);
目的地记录(strLName);
目的写入码(strFisCode);
目的地书面资源(斯特尔伯特);
目的地书面资本(strCity);
目的地记录(strZip);
目的地书面记录(strProv);
目的地书面资本(strCC);
目的地书面限制(strIban);
目的地书面记录(标准邮件);
//端区
}
//区域Getter和Setter
公共字符串getStrFName(){
返回strFName;
}
public void setStrFName(字符串strFName){
this.strFName=strFName;
}
公共字符串getStrLName(){
返回strLName;
}
public void setStrLName(字符串strLName){
this.strLName=strLName;
}
公共字符串getstrficode(){
返回strficode;
}
public void setStrFisCode(字符串strFisCode){
this.strFisCode=strFisCode;
}
公共字符串getStrBirth(){
返回strberth;
}
公共void setStrBirth(字符串strBirth){
this.strberth=strberth;
}
公共字符串getStrCity(){
回报率;
}
公共void setStrCity(字符串结构){
this.strCity=strCity;
}
公共字符串getStrZip(){
返回strZip;
}
公共void setStrZip(字符串strZip){
this.strZip=strZip;
}
公共字符串getStrProv(){
返回strProv;
}
公共void setStrProv(字符串strProv){
this.strProv=strProv;
}
公共字符串getStrCC(){
返回strc;
}
公共无效设置TRCC(字符串strCC){
this.strc=strc;
}
公共字符串getStrIban(){
返回斯特里班;
}
公共无效设置strIban(字符串strIban){
this.strIban=strIban;
}
公共字符串getStrMail(){
返回标准邮件;
}
公共无效setStrMail(字符串strMail){
this.strMail=strMail;
}
//端区
}
这是您应该如何传递和拉动包裹对象:
// Pass
Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);
// and then pull them:
Intent i = getIntent();
MyParcelable myParcelableObject = (MyParcelable) i.getParcelableExtra("name_of_extra");
DataUser
不是Serializable
而是…getparcelableextra
@Spartan谢谢!)我想这从一开始就是个愚蠢的问题。。D: