#java #android
#java #Android
Вопрос:
Я пытаюсь создать разделяемый класс. Класс расширяет TableRow:
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import android.widget.TableRow;
public class AcmTableRow extends TableRow implements Parcelable{
private int index;
public boolean isSection;
private String volumeLink;
private String rowId;
private String cfr;
private static Context context;
public AcmTableRow(Context context) {
super(context);
}
public AcmTableRow(Context context, Parcel in) {
super(context);
AcmTableRow.context = context;
readFromParcel(in);
}
private void readFromParcel(Parcel in) {
//strValue = in.readString();
//intValue = in.readInt();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//dest.writeString(strValue);
//dest.writeInt(intValue);
}
public void setIndex(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public void setRowId(String rowId) {
this.rowId = rowId;
}
public String getRowId() {
return rowId;
}
public void setCfr(String cfr) {
this.cfr = cfr;
}
public String getCfr() {
return cfr;
}
public void setVolumeLink(String volumeLink) {
this.volumeLink = volumeLink;
}
public String getVolumeLink() {
return volumeLink;
}
public static final Parcelable.Creator<AcmTableRow> CREATOR = new Parcelable.Creator<AcmTableRow>() {
public AcmTableRow createFromParcel(Parcel in) {
return new AcmTableRow(context, in);
}
public AcmTableRow[] newArray(int size) {
return new AcmTableRow[size];
}
};
}
Я в замешательстве от того, что мне нужно вставить:
readFromParcel(Parcel in)
И
writeToParcel(Parcel dest, int flags)
Любые объяснения или помощь приветствуются.
Спасибо
Фил
Комментарии:
1. Зачем вам нужно посылать представление? У меня сильное чувство, что представления не должны передаваться через
Intent
. Может быть, вам просто нужно отделить свою логику от view (TableRow
) вместо ее расширения?2. Мои представления TableRow создаются на фабрике TableRow с помощью AsyncTask. Задача требует много времени, сбора данных и построения представления, поэтому ее необходимо выполнять вне потока пользовательского интерфейса.
Ответ №1:
Метод writeToParcel просто сглаживает объект в пакет. Вы будете использовать это, когда вам нужно передать свой объект между действиями. В вашем случае это должно выглядеть так:
public void writeToParcel (Parcel dest, int flags)
{
dest.writeInt(index);
dest.writeBoolean(isSection);
dest.writeString(volumeLink);
dest.writeString(rowId);
dest.writeString(cfr);
}
Мне никогда не приходилось использовать readFromParcel, и я не уверен, что вам это тоже нужно. Ваш объект будет создан из посылки при вызове соответствующего метода в вашем следующем действии.
Просто небольшое замечание, вы, вероятно, не хотите передавать контекст в свой разделяемый класс. Я даже не уверен, что вы можете. Вам нужно будет назначить контекст при повторном раздувании parcelable позже.
Комментарии:
1. просто продолжение. Я смог передать контекст в разделяемый класс без проблем. спасибо за помощь.
2. Не могли бы вы опубликовать, как вам удалось передать контекст в parcelable?
Ответ №2:
Это простой рабочий разделяемый пример:
public class ParcelableExample implements Parcelable {
private int intMember;
private String stringMember;
/*
* Getters and setters
* ....
*/
/*
* Constructors
* ....
*/
/*
* Custom parcelable implementation
*/
private ParcelableExample(Parcel in) {
// notice that we are reading in the same order as we have written
intMember = in.readInt();
stringMember = in.readString();
}
@Override
public int describeContents() {
return hashCode();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(intMember);
dest.writeString(stringMember);
}
@SuppressWarnings("rawtypes")
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public ParcelableExample createFromParcel(Parcel in) {
return new ParcelableExample(in);
}
public ParcelableExample[] newArray(int size) {
return new ParcelableExample[size];
}
}