我从 Android ActivityForResult 发送一个 parcelable class 并收到 null
I send an parcelable class from Android ActivityForResult and receive null
很抱歉提出常见问题,但我检查了所有问题,但没有发现错误。我从 Activity 发送 class 并收到 NULL。创建 Intent 后检查是否正确(我的代码中的 readbackCi)。你能帮我找到解决办法吗?
我的 class CityItem
import android.os.Parcel;
import android.os.Parcelable;
public class CityItem implements Parcelable {
public static final String ITEM_SEP = System.getProperty("line.separator");
public static final String NAME = "City";
public static final String REGNAME = "Region";
public static final String CODE = "Code";
public static final String SEARCH = "Search";
private String mName;
private String mRegName;
private String mSearch;
private String mCode;
public CityItem(String name, String regname, String code, String search) {
mName = name;
mRegName = regname;
mSearch = search;
mCode = code;
}
private CityItem(Parcel in) {
in.readParcelable(CityItem.class.getClassLoader());
setName(in.readString());
setRegName(in.readString());
setCode(in.readString());
setSearch(in.readString());
}
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getRegName() {
return mRegName;
}
public void setRegName(String regname) {
mRegName = regname;
}
public String getCode() {
return mCode;
}
public void setCode(String code) {
mRegName = code;
}
public String getSearch() {
return mSearch;
}
public void setSearch(String search) {
mRegName = search;
}
public String toString() {
return mName + ITEM_SEP + mRegName + ITEM_SEP + mCode + ITEM_SEP
+ mSearch;
}
public String toLog() {
return "Name:" + mName + ITEM_SEP + "Region:" + mRegName
+ ITEM_SEP + "Code:" + mCode + ITEM_SEP + "Search:"
+ mSearch + "\n";
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] { mName, mRegName, mCode, mSearch });
}
public static final Parcelable.Creator<CityItem> CREATOR = new Parcelable.Creator<CityItem>() {
@Override
public CityItem createFromParcel(Parcel source) {
return new CityItem(source);
}
@Override
public CityItem[] newArray(int size) {
return new CityItem[size];
}
};
}
第二个activity
public void enterClicked(CityItem str) {
Log.i(TAG,"Entered enterClicked()");
Intent result = new Intent();
result.putExtra("TAG", str);
CityItem readbackCi = result.getParcelableExtra("TAG");
Log.d(TAG, "\n\n\t" + readbackCi.NAME);
setResult(this.RESULT_OK, result);
finish();
}
主要activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i(TAG, "Entered onActivityResult()");
if(ADD_DERIVAL_REQUEST == requestCode && this.RESULT_OK == resultCode)
{
CityItem ci = (CityItem) getIntent().getParcelableExtra("TAG");
if (null != ci) {
EditText1.setText(ci.getName());
}
return;
} else if (ADD_DERIVAL_REQUEST == requestCode && RESULT_CANCELED == resultCode)
{
return;
}
}
您需要使用 Intent data
才能返回结果。
CityItem ci = (CityItem) data.getParcelableExtra("TAG");
getIntent()
将 return 用于主要 activity 的意图开始,它不是您感兴趣的那个。
您的 parcelable class CityItem 的实现不正确。检查这个:
package com.mobgen.halo.android.sdk.generalcontent.business.parser;
import android.os.Parcel;
import android.os.Parcelable;
public class CityItem implements Parcelable {
public static final String ITEM_SEP = System.getProperty("line.separator");
public static final String NAME = "City";
public static final String REGNAME = "Region";
public static final String CODE = "Code";
public static final String SEARCH = "Search";
private String mName;
private String mRegName;
private String mSearch;
private String mCode;
public CityItem(String name, String regname, String code, String search) {
mName = name;
mRegName = regname;
mSearch = search;
mCode = code;
}
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getRegName() {
return mRegName;
}
public void setRegName(String regname) {
mRegName = regname;
}
public String getCode() {
return mCode;
}
public void setCode(String code) {
mRegName = code;
}
public String getSearch() {
return mSearch;
}
public void setSearch(String search) {
mRegName = search;
}
public String toString() {
return mName + ITEM_SEP + mRegName + ITEM_SEP + mCode + ITEM_SEP + mSearch;
}
public String toLog() {
return "Name:" + mName + ITEM_SEP + "Region:" + mRegName
+ ITEM_SEP + "Code:" + mCode + ITEM_SEP + "Search:"
+ mSearch + "\n";
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.mName);
dest.writeString(this.mRegName);
dest.writeString(this.mSearch);
dest.writeString(this.mCode);
}
protected CityItem(Parcel in) {
this.mName = in.readString();
this.mRegName = in.readString();
this.mSearch = in.readString();
this.mCode = in.readString();
}
public static final Creator<CityItem> CREATOR = new Creator<CityItem>() {
public CityItem createFromParcel(Parcel source) {
return new CityItem(source);
}
public CityItem[] newArray(int size) {
return new CityItem[size];
}
};
}
除此之外,您必须使用 "data" Intent
而不是来自 getIntent()
的 activity。activity。
很抱歉提出常见问题,但我检查了所有问题,但没有发现错误。我从 Activity 发送 class 并收到 NULL。创建 Intent 后检查是否正确(我的代码中的 readbackCi)。你能帮我找到解决办法吗?
我的 class CityItem
import android.os.Parcel;
import android.os.Parcelable;
public class CityItem implements Parcelable {
public static final String ITEM_SEP = System.getProperty("line.separator");
public static final String NAME = "City";
public static final String REGNAME = "Region";
public static final String CODE = "Code";
public static final String SEARCH = "Search";
private String mName;
private String mRegName;
private String mSearch;
private String mCode;
public CityItem(String name, String regname, String code, String search) {
mName = name;
mRegName = regname;
mSearch = search;
mCode = code;
}
private CityItem(Parcel in) {
in.readParcelable(CityItem.class.getClassLoader());
setName(in.readString());
setRegName(in.readString());
setCode(in.readString());
setSearch(in.readString());
}
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getRegName() {
return mRegName;
}
public void setRegName(String regname) {
mRegName = regname;
}
public String getCode() {
return mCode;
}
public void setCode(String code) {
mRegName = code;
}
public String getSearch() {
return mSearch;
}
public void setSearch(String search) {
mRegName = search;
}
public String toString() {
return mName + ITEM_SEP + mRegName + ITEM_SEP + mCode + ITEM_SEP
+ mSearch;
}
public String toLog() {
return "Name:" + mName + ITEM_SEP + "Region:" + mRegName
+ ITEM_SEP + "Code:" + mCode + ITEM_SEP + "Search:"
+ mSearch + "\n";
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] { mName, mRegName, mCode, mSearch });
}
public static final Parcelable.Creator<CityItem> CREATOR = new Parcelable.Creator<CityItem>() {
@Override
public CityItem createFromParcel(Parcel source) {
return new CityItem(source);
}
@Override
public CityItem[] newArray(int size) {
return new CityItem[size];
}
};
}
第二个activity
public void enterClicked(CityItem str) {
Log.i(TAG,"Entered enterClicked()");
Intent result = new Intent();
result.putExtra("TAG", str);
CityItem readbackCi = result.getParcelableExtra("TAG");
Log.d(TAG, "\n\n\t" + readbackCi.NAME);
setResult(this.RESULT_OK, result);
finish();
}
主要activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i(TAG, "Entered onActivityResult()");
if(ADD_DERIVAL_REQUEST == requestCode && this.RESULT_OK == resultCode)
{
CityItem ci = (CityItem) getIntent().getParcelableExtra("TAG");
if (null != ci) {
EditText1.setText(ci.getName());
}
return;
} else if (ADD_DERIVAL_REQUEST == requestCode && RESULT_CANCELED == resultCode)
{
return;
}
}
您需要使用 Intent data
才能返回结果。
CityItem ci = (CityItem) data.getParcelableExtra("TAG");
getIntent()
将 return 用于主要 activity 的意图开始,它不是您感兴趣的那个。
您的 parcelable class CityItem 的实现不正确。检查这个:
package com.mobgen.halo.android.sdk.generalcontent.business.parser;
import android.os.Parcel;
import android.os.Parcelable;
public class CityItem implements Parcelable {
public static final String ITEM_SEP = System.getProperty("line.separator");
public static final String NAME = "City";
public static final String REGNAME = "Region";
public static final String CODE = "Code";
public static final String SEARCH = "Search";
private String mName;
private String mRegName;
private String mSearch;
private String mCode;
public CityItem(String name, String regname, String code, String search) {
mName = name;
mRegName = regname;
mSearch = search;
mCode = code;
}
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getRegName() {
return mRegName;
}
public void setRegName(String regname) {
mRegName = regname;
}
public String getCode() {
return mCode;
}
public void setCode(String code) {
mRegName = code;
}
public String getSearch() {
return mSearch;
}
public void setSearch(String search) {
mRegName = search;
}
public String toString() {
return mName + ITEM_SEP + mRegName + ITEM_SEP + mCode + ITEM_SEP + mSearch;
}
public String toLog() {
return "Name:" + mName + ITEM_SEP + "Region:" + mRegName
+ ITEM_SEP + "Code:" + mCode + ITEM_SEP + "Search:"
+ mSearch + "\n";
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.mName);
dest.writeString(this.mRegName);
dest.writeString(this.mSearch);
dest.writeString(this.mCode);
}
protected CityItem(Parcel in) {
this.mName = in.readString();
this.mRegName = in.readString();
this.mSearch = in.readString();
this.mCode = in.readString();
}
public static final Creator<CityItem> CREATOR = new Creator<CityItem>() {
public CityItem createFromParcel(Parcel source) {
return new CityItem(source);
}
public CityItem[] newArray(int size) {
return new CityItem[size];
}
};
}
除此之外,您必须使用 "data" Intent
而不是来自 getIntent()
的 activity。activity。