簡體   English   中英

將可拆分對象從片段共享到活動

[英]Share Parcelable object from Fragment to Activity

您好,我嘗試將對象從Fragment傳遞到Activity,如下所示:

 Bundle bundle1 = new Bundle();
 bundle1.putParcelable("company", companies.get(i));
 Intent intent = new Intent(getActivity(), CompanyInfoActivity.class);
 intent.putExtras(bundle1);
 getActivity().startActivity(intent);

在活動中,我接下來要做:

 Intent intent = getIntent();
 Bundle bundle = intent.getExtras();
 company = bundle.getParcelable("company");

我嘗試:

 Intent intent = new Intent(getActivity(), CompanyInfoActivity.class);
            intent.putExtra("company",companies.get(i));
            getActivity().startActivity(intent);

在活動中:

    Intent intent = getIntent();
    company = intent.getParcelableExtra("company");
    tvName.setText(company.getName()); 

我知道后, company字段為空。 我確定我發送的對象沒有空字段。

我的公司

public class Company implements Parcelable {

private int uid;
@SerializedName("field_user_org_name_value")
private String name;
@SerializedName("field_user_org_address_value")
private String address;
@SerializedName("field_user_org_category_tid")
private int category;
@SerializedName("field_user_org_town_tid")
private int cityId;
@SerializedName("image")
private String imageUrl;
private int online;
@SerializedName("field_user_org_description_value")
private String description;
@SerializedName("field_user_org_phone_value")
private String mobPhone;
@SerializedName("field_user_org_stac_phone_value")
private String phone;

double lat;
double lng = 0;
double distance;


public double getDistance() {
    return distance;
}

public void setDistance(double distance) {
    this.distance = distance;
}

public double getLng() {
    return lng;
}

public void setLng(double lng) {
    this.lng = lng;
}

public double getLat() {
    return lat;
}

public void setLat(double lat) {
    this.lat = lat;
}

public String getDescription() {
    return description;
}

public String getMobPhone() {
    return mobPhone;
}

public String getPhone() {
    return phone;
}

public int getOnline() {
    return online;
}


public Company(int id, String name, String address, int category, int cityId, String imageUrl, int online, String description, String mobPhone, String phone, Double lat, Double lng, Double distance) {
    this.uid = id;
    this.name = name;
    this.address = address;
    this.category = category;
    this.cityId = cityId;
    this.imageUrl = imageUrl;
    this.online = online;
    this.description = description;
    this.mobPhone = mobPhone;
    this.phone = phone;
    this.lat = lat;
    this.lng = lng;
    this.distance = distance;
}

public Company(Parcel in) {
    in.writeInt(uid);
    in.writeString(name);
    in.writeString(address);
    in.writeInt(category);
    in.writeInt(cityId);
    in.writeString(imageUrl);
    in.writeInt(online);
    in.writeString(description);
    in.writeString(mobPhone);
    in.writeString(phone);
    in.writeDouble(lat);
    in.writeDouble(lng);
    in.writeDouble(distance);

}

public int getUid() {
    return uid;
}

public String getName() {
    return name;
}

public String getAddress() {
    return address;
}

public int getCategory() {
    return category;
}

public int getCityId() {
    return cityId;
}

public String getImageUrl() {
    return imageUrl;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(uid);
    dest.writeString(name);
    dest.writeString(address);
    dest.writeInt(category);
    dest.writeInt(cityId);
    dest.writeString(imageUrl);
    dest.writeInt(online);
    dest.writeString(description);
    dest.writeString(mobPhone);
    dest.writeString(phone);
    dest.writeDouble(lat);
    dest.writeDouble(lng);
    dest.writeDouble(distance);

}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {

    @Override
    public Object createFromParcel(Parcel source) {
        return new Company(source);
    }

    @Override
    public Object[] newArray(int size) {
        return new Company[size];
    }
};


public static class CustomComparator implements Comparator<Company> {
    @Override
    public int compare(Company o1, Company o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

public static class CustomComparatorDistance implements Comparator<Company> {
    @Override
    public int compare(Company o1, Company o2) {
        return Double.compare(o1.getDistance(), o2.getDistance());
    }
}

}

在這段代碼中

public Company(Parcel in) {
    in.writeInt(uid);
    in.writeString(name);
    in.writeString(address);
    in.writeInt(category);
    in.writeInt(cityId);
    in.writeString(imageUrl);
    in.writeInt(online);
    in.writeString(description);
    in.writeString(mobPhone);
    in.writeString(phone);
    in.writeDouble(lat);
    in.writeDouble(lng);
    in.writeDouble(distance);

}

您應該從包裹中讀取值:

uid = in.readInt();

等等

您的問題出在Parcelable的實現中-特別是您的Parcel構造函數:

public Company(Parcel in) {
    in.writeInt(uid);
    in.writeString(name);
    ...
}

的字段Parcel在你的構造。 在這一點上,您需要將數據從Parcel 入正在創建的對象中。 例如:

public Company(Parcel in) {
    uid = in.readInt();
    name = in.readString();
    ...
}

您可以創建一個偵聽器,以在片段和活動之間進行通信:

public interface CompanyListener
{
    public void sendCompany(Company company);
}

接下來,您必須在Fragment中創建此偵聽器的實例

private CompanyListener companyListener;

OnAttach您必須實例化它,並在OnDetach取消實例化它:

@Override
public void onAttach(Activity activity)
{
    super.onAttach(activity);
    this.companyListener = (YourActivity) activity;
}

@Override
public void onDetach()
{
    super.onDetach();
    this.companyListener = null;
}

現在,您只需要在您的活動中實施它即可。

您也可以使用Square的Otto庫,但更為復雜:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM