我有一个Android应用程序,其中包含实现Parcelable界面的自定义对象。我设置它的方式是我的程序最初从包中的文件创建自定义类ArrayList
Products
。我可以看到并确认arraylist及其实例变量标签是否适当填充。这个类有几个实例变量,另一个是另一个ArrayList
,但有String
类。记住这个事实。
我正在尝试将ArrayList<Product>
传递给像这样的新活动:
try {
Intent i = new Intent(RootActivity.this, ProductsActivity.class); //Intent from this activity to the next
i.putParcelableArrayListExtra("Products", app_products); //Puts my ArrayList<Class A> as an extra
startActivity(i); //Launch the activity
}
catch(Exception e){
Log.d("Activity Error", "Error Here:" + e.getMessage());
}
我通过使用
拉出ArrayList
,从我的新活动中的意图中收回信息
app_products = getIntent().getParcelableArrayListExtra("Products");
对于我的自定义类,它看起来像这样,以及实现的Parcelable方法。
public class Product implements Parcelable{
private String name;
private String cost;
private ArrayList<String> similarItems;
public Product{
name = null;
cost = null;
similarItems = new ArrayList<String>();
}
public Product(String name, String cost){
this();
this.name = name;
this.cost = cost;
}
public addSimilarItem(String item){
similarItems.add(item);
}
public static final Parcelable.Creator<Product> CREATOR
= new Parcelable.Creator<Product>()
{
public Product createFromParcel(Parcel in) {
return new Product(in);
}
public Product[] newArray(int size) {
return new Product[size];
}
};
public int describeContents(){
return 0;
}
private Product(Parcel in){
name = in.readString();
cost = in.readString();
similarItems = in.readArrayList(String.class.getClassLoader());
}
public void writeToParcel(Parcel out, int flags){
out.writeString(name);
out.writeString(cost);
out.writeList(similarItems);
}
}
所以这很好用没有我的字符串arraylist被添加到类中
评论out.writeList(similarItems);
以及similarItems = in.readArrayList(String.class.getClassLoader());
但是一旦你将它们重新添加到类中,应用程序崩溃了,但它甚至不会抛出一条消息进行调试。我已经在try-catch
个语句周围包裹了所有内容,并且android甚至没有报告应用程序在跳板上的正常对话框崩溃。我真的很茫然。
值得一提的是,我已经使用了一些日志语句来了解程序崩溃的位置,尽管android不会抛出异常。我可以看到我的ArrayList中的所有项都经过writeToParcelMethod并完成写入。从不调用Product(Parcel in)方法。最后,我还可以看到我正在启动新活动的课程进入Pause State
,我的新活动永远不会创建。
如果我能提供任何其他信息,请告诉我。
答案 0 :(得分:1)
相当确定您的问题是使用writeList()
。 writeList()
似乎表明它与writeValue()
的合同遵循列表中包含的项目。但是,readList()
似乎表明值必须为Parcelable
(String
不是)。
无论哪种方式,通常这些调用都必须与其反向非常具体地相关联(例如writeString()
必须使用readString()
,而不是readValue()
读取,因此您应该使用提供的读/写String
List
的方法:
// Takes in a List<String> which may be null
out.writeStringList(similarItems);
// Returns either null or a new ArrayList<String> with the contents
similarItems = in.createStringArrayList();
答案 1 :(得分:0)
这些似乎是由于我的应用程序用作资源的一些格式错误的XML。不知道为什么会出现这个问题,但经过几个小时的搜索后,我能够删除错误的XML,并在以后需要发布应用程序时再次访问此问题。
现在,我只是担心继续发展它。如果我发现有关我的XML的任何有趣内容,我会记得回头看看。