【问题标题】:I send an parcelable class from Android ActivityForResult and receive null我从 Android ActivityForResult 发送一个 parcelable 类并收到 null
【发布时间】:2015-10-13 22:24:09
【问题描述】:

对不起,常见问题,但我检查了所有并找不到错误。我从 Activity 发送类并接收 NULL。创建 Intent 后检查是否正确(我的代码中为 readbackCi)。你能帮我找到解决办法吗?

我的班级 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];
    }
};

}

第二次活动

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

主要活动

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

【问题讨论】:

    标签: java android android-intent android-activity parcelable


    【解决方案1】:

    您需要使用Intent data 来获取结果。

    CityItem ci = (CityItem) data.getParcelableExtra("TAG");

    getIntent() 将返回用于主要活动启动的意图,它不是您感兴趣的意图。

    【讨论】:

    • 没错!非常感谢!
    【解决方案2】:

    parcelable 类 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];
            }
        };
    }
    

    除此之外,您必须使用“数据”Intent 而不是来自 getIntent() 的数据,后者是用于启动此活动的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多