2013-07-09 2 views
2

Я хотел передать объект из одного класса в другой, и мой кодКак передать объект намеренно

private MemberLoginResponse loginResponse; 
    . 
    . 
    Intent intent = new Intent(); 
    intent = new Intent(context, BillingDeskActivity.class); 
    intent.putExtra("privilages", loginResponse); 
    startActivity(intent); 

В другой деятельности, чтобы получить данные, которые я использую этот код

Intent i_privilages = getIntent(); 
privilages = (MemberLoginResponse) getIntent().getSerializableExtra("privilages"); 

и даже я держал мой класс реализует Serializable

Мой класс, где я ударил ред объявляя Список_массивов

public class MemberLoginResponse implements Parcelable { 
public Integer merchantMemberId = 0; 
public Integer merchantId = 0; 
public String merchantName = ""; 
public String merchantLogo = ""; 
public String merchantType = ""; 
public String merchantHQAddress = ""; 
public List<CustomSystemPrivilege> merchantPrivileges; 
public List<CustomSystemPrivilege> privileges; 
public StatusCode statusCode; 
public Integer branchId = 0; 

public MemberLoginResponse(Parcel in) { 
    merchantMemberId = in.readInt(); 
    merchantId = in.readInt(); 
    merchantName = in.readString(); 
    merchantLogo = in.readString(); 
    merchantType = in.readString(); 
    merchantHQAddress = in.readString(); 
    in.readList(merchantPrivileges, 
      CustomSystemPrivilege.class.getClassLoader()); 
    in.readList(privileges, CustomSystemPrivilege.class.getClassLoader()); 
    branchId = in.readInt(); 
} 

public MemberLoginResponse() { 
    // TODO Auto-generated constructor stub 
} 

public static final Parcelable.Creator<MemberLoginResponse> CREATOR = new Parcelable.Creator<MemberLoginResponse>() { 
    @Override 
    public MemberLoginResponse createFromParcel(Parcel in) { 
     return new MemberLoginResponse(in); 
    } 

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

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

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeInt(merchantMemberId); 
    dest.writeInt(merchantId); 
    dest.writeString(merchantName); 
    dest.writeString(merchantLogo); 
    dest.writeString(merchantType); 
    dest.writeString(merchantHQAddress); 
    dest.writeList(merchantPrivileges); 
    dest.writeList(privileges); 
    dest.writeInt(branchId); 
} 

}}

+1

Проверьте этот ответ http://stackoverflow.com/a/10572474/786337 – Tarun

+0

Как реализовать это в моем коде, когда я использую Parcelable он говорит мне, чтобы реализовать методы, и данные не извлекаются в мою деятельность. – sarabu

+0

@ Pankaj Kumar. Я разместил свой полный код там, как инициализировать StatusCode в моем классе – sarabu

ответ

2

Ниже приведен код, позволяющий читать и записывать еще один дополни- тельный объект.

class MemberLoginResponse implements Parcelable { 
//  
private StatusCode statusCode; 
public void writeToParcel(Parcel dest, int flags) { 

     dest.writeParcelable(statusCode , flags); 

    } 
} 

, если вы хотите прочитать его использовать этот

statusCode = (StatusCode)in.readParcelable(A.class.getClassLoader()); 
+0

Все еще не могу понять это, хотя я сделал все, чтобы он не показывал значения и отображает исключение нулевого указателя в другом действии. – sarabu

+0

Поделиться кодом, в котором вы пишете. Вы инициализировали statusCode? –

+0

Теперь эта строка показывает ошибку 'in.readList (merchantPrivileges, CustomSystemPrivilege.class.getClassLoader());' i.e. в MemberLoginResponse – sarabu

0

попробовать следующим способом

public class clsChart implements Parcelable{ 
private int chartID; 
private String chartName; 
private int chartType; 
public clsChart(){ 

} 

@SuppressWarnings("rawtypes") 
    public static final Parcelable.Creator CREATOR = 
     new Parcelable.Creator() { 
      @Override 
      public clsChart createFromParcel(Parcel in) { 
       return new clsChart(in); 
      } 

      @Override 
      public clsChart[] newArray(int size) { 
       return new clsChart[size]; 
      } 
     }; 
@Override 
public int describeContents() { 

    return 0; 
} 
@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeInt(chartID); 
    dest.writeString(chartName); 
    dest.writeInt(chartType); 

} 
private void readFromParcel(Parcel in) { 
    chartID = in.readInt(); 
    chartName = in.readString(); 
    chartType = in.readInt(); 

} 

public int getChartID() { 
    return chartID; 
} 
public void setChartID(int chartID) { 
    this.chartID = chartID; 
} 
public String getChartName() { 
    return chartName; 
} 
public void setChartName(String chartName) { 
    this.chartName = chartName; 
} 
public int getChartType() { 
    return chartType; 
} 
public void setChartType(int chartType) { 
    this.chartType = chartType; 
} 
public clsChart(Parcel in) { 
    readFromParcel(in); 
} 
public clsChart(int chartID,String chartName,int chartType) 
{ 
    this.chartID = chartID; 
    this.chartName = chartName; 
    this.chartType = chartType; 
} 

} 

now Bundle b=new Bundle(); 
b.putParcelable("your_key",your_object_which_implements_parcelable(here chart object)); 
intent.putExtras(b); 
+0

У меня есть класс 'StatusCode statusCode;'. Как читатьFromParcel и writeToParcel. В этом классе StatusCode снова у меня есть набор переменных – sarabu

+0

Следуйте тому же, что я сделал для clsChart Class, в нем нет путаницы –

+0

clsChart имеет переменные, которые содержат int, String .. Но если вы проверите мой класс, который contatins 'StatusCode', , класс i.e.объект так, чтобы объявить, что в readFromParcel и writeToParcel – sarabu

0

Если вы только проездом объекты вокруг тогда Parcelable был разработан для этого. Для этого требуется немного больше усилий, чем использование собственной сериализации Java, но это быстрее.

Из документов, простой пример того, как реализовать это:

// simple class that just has one member property as an example 
public class MyParcelable implements Parcelable { 
    private int mData; 

    /* everything below here is for implementing Parcelable */ 

    // 99.9% of the time you can just ignore this 
    public int describeContents() { 
     return 0; 
    } 

    // write your object's data to the passed-in Parcel 
    public void writeToParcel(Parcel out, int flags) { 
     out.writeInt(mData); 
    } 

    // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods 
    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() { 
     public MyParcelable createFromParcel(Parcel in) { 
      return new MyParcelable(in); 
     } 

     public MyParcelable[] newArray(int size) { 
      return new MyParcelable[size]; 
     } 
    }; 

    // example constructor that takes a Parcel and gives you an object populated with it's values 
    private MyParcelable(Parcel in) { 
     mData = in.readInt(); 
    } 
} 

Заметим, что в случае, если вы имеете более чем одно поле, чтобы извлечь из данного Parcel, вы должны сделать это в том же порядке вы помещаете их (то есть в подход FIFO).

После того, как у вас есть ваши объекты реализация Parcelable это просто вопрос сдачи их в ваш Intents с putExtra():

Intent i = new Intent(); 
i.putExtra("name_of_extra", myParcelableObject); 

Тогда вы можете вытащить их обратно с getParcelableExtra():

Intent i = getIntent(); 
MyParcelable myParcelableObject = (MyParcelable) i.getParcelableExtra("name_of_extra"); 

Надеется, что это поможет & помочь вам. :)

+0

В моем коде у меня разные классы, которые я не смог прочитать и написать для StatusCode и CustomSystemPrivilege, например mData в вашем классе. – sarabu

Смежные вопросы