我搜索了一些主题但未找到解决问题的方法。
public class Series implements Parcelable {
private String name;
private int numOfSeason;
private int numOfEpisode;
/** Constructors and Getters/Setters have been removed to make reading easier **/
public Series(Parcel in) {
String[] data = new String[3];
in.readStringArray(data);
this.name = data[0];
this.numOfSeason = Integer.parseInt(data[1]);
this.numOfEpisode = Integer.parseInt(data[2]);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] { this.name,
String.valueOf(this.numOfSeason),
String.valueOf(this.numOfEpisode) });
}
private void readFromParcel(Parcel in) {
name = in.readString();
numOfSeason = in.readInt();
numOfEpisode = in.readInt();
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
@Override
public Series createFromParcel(Parcel in) {
return new Series(in);
}
@Override
public Series[] newArray(int size) {
return new Series[size];
}
};
}
在我的MainActivity中,我有一个ArrayList。为了使列表动态可编辑,我需要将其传递给另一个我可以编辑它的活动。
ArrayList<Series> listOfSeries = new ArrayList<Series>();
public void openAddActivity() {
Intent intent = new Intent(this, AddActivity.class);
intent.putParcelableArrayListExtra(
"com.example.episodetracker.listofseries",
(ArrayList<? extends Parcelable>) listOfSeries);
startActivity(intent);
}
我需要强制转换列表,否则Eclipse会给出以下错误消息。 Intent类型中的方法putParcelableArrayListExtra(String,ArrayList)不适用于参数(String,List)
这是正确的方法吗?
ArrayList<Series> list = savedInstanceState
.getParcelableArrayList("com.example.episodetracker.listofseries");
这是我尝试读取另一项活动中的数据的方式。
它在上面的线上崩溃了。即getParcelableArrayList部分。
答案 0 :(得分:38)
问题在于写到包裹并从包裹中读入...
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(numOfSeason);
dest.writeInt(numOfEpisode);
}
private void readFromParcel(Parcel in) {
name = in.readString();
numOfSeason = in.readInt();
numOfEpisode = in.readInt();
}
你写的内容必须与你读的内容相符......
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent i = new Intent(this,SecondActivity.class);
ArrayList<testparcel> testing = new ArrayList<testparcel>();
i.putParcelableArrayListExtra("extraextra", testing);
startActivity(i);
}
/**********************************************/
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<testparcel> testing = this.getIntent().getParcelableArrayListExtra("extraextra");
}
}
上面的代码来自两个不同的活动onCreate()。第一个发射第二个;它工作正常我能够毫无问题地拉出parcelable。
答案 1 :(得分:3)
您应该在Intent
类上使用putParcelableArrayListExtra()
方法。
答案 2 :(得分:3)
我使用了putParcelableArrayList(<? extends Parcelable>)
对象中的Bundle
。不是直接来自Intent对象。(我真的不知道有什么区别)。但我以这种方式使用:
ArrayList<ParcelableRow> resultSet = new ArrayList<ParcelableRow>();
resultSet = loadData();
Bundle data = new Bundle();
data.putParcelableArrayList("search.resultSet", resultSet);
yourIntent.putExtra("result.content", data);
startActivity(yourIntent);
稍后在您的新活动中,您可以填充最近插入Bundle对象的数据,如下所示:
Bundle data = this.getIntent().getBundleExtra("result.content");
ArrayList<ParcelableRow> result = data.getParcelableArrayList("search.resultset");
请记住,您的ArrayList<>
必须只包含可分配的对象。并且只是为了确保您已经传递了数据,您可以检查收到的数据是否为空,只是为了避免问题。
答案 3 :(得分:0)
也许这有助于某人..否则我的问题是我使用了write和readValue但它应该匹配类型如writeInt,readInt writeString,readString等等
答案 4 :(得分:0)
我是以这种方式做的:
var intent = Intent(this@McqActivity,ResultActivity::class.java)
intent.putParcelableArrayListExtra("keyResults", ArrayList(resultList))
// resultList is of type mutableListOf<ResultBO>()
startActivity(intent)
并用于使可分类类。我只是简单地做two operation
,首先在数据类上方使用 @Parcelize Annotation
,然后像下面这样用Parcelable
继承它。.
import kotlinx.android.parcel.Parcelize
import android.os.Parcelable
@Parcelize // Include Annotion
data class ResultBO(val questionBO: QuestionBO) : Parcelable {
constructor() : this(QuestionBO())
}
在接收端
if (intent != null) {
var results = intent.getParcelableArrayListExtra<Parcelable>("keyResults")
}
答案 5 :(得分:0)
您可以传递Parcelable ArrayList
发件人活动->
startActivity(Intent(this, SenderActivity::class.java).apply { putExtra("getList",list)})
接收者活动->
private lateinit var list: ArrayList<List>
list = this.intent.extras?.getParcelableArrayList("getList")!!
您将在列表中获得所有Arraylist。