我正在尝试创建一个应用程序,此时在应用程序中我正在启动一项活动,并为该活动添加了一些可插入的附加内容。但是,随着我的额外内容的添加,意图将无法启动活动。注释putExtra行可以使其正常工作。没有错误可言,应用程序只是循环并允许再次使用先前的活动。 问题代码在于:
//puzOut is a Puzzle object (code below)
intent intent = new Intent(ChooseActivity.this, GameActivity.class);
intent.putExtra("puzzle", puzOut); // <- prevents activity starting
startActivity(intent);
putExtra中的数据是我的应用程序Puzzle中的一个对象。下面是代码,包括Parcelling代码。
public class Puzzle implements Parcelable{
private String Name;
private String pictureSet;
private Fruit_Tile[] fruitArray;
int rows;
int columns;
public Puzzle(String puzzleId, String picSet, Fruit_Tile[] array, int rowCount, int columnCount)
{
Name = puzzleId;
pictureSet = picSet;
fruitArray = array;
rows = rowCount;
columns = columnCount;
}
private Puzzle(Parcel in) {
Name = in.readString();
pictureSet = in.readString();
Parcelable[] parcelableArray = in.readParcelableArray(Fruit_Tile.class.getClassLoader());
//Fruit_Tile[] results = null;
if(parcelableArray != null)
{
fruitArray = Arrays.copyOf(parcelableArray, parcelableArray.length, Fruit_Tile[].class);
}
rows = in.readInt();
columns = in.readInt();
}
public String getName()
{
return Name;
}
public String getPictureSet()
{
return pictureSet;
}
public Fruit_Tile[] getFruitArray()
{
return fruitArray;
}
public int getRows()
{
return rows;
}
public int getColumns()
{
return columns;
}
@Override
public void writeToParcel(Parcel out, int flags){
out.writeString(Name);
out.writeString(pictureSet);
out.writeParcelableArray(fruitArray, flags);
out.writeInt(rows);
out.writeInt(columns);
}
public static final Parcelable.Creator<Puzzle> CREATOR = new Parcelable.Creator<Puzzle>(){
public Puzzle createFromParcel(Parcel in) {
return new Puzzle(in);
}
public Puzzle[] newArray(int size) {
return new Puzzle[size];
}
};
@Override
public int describeContents()
{
return 0;
}
}
拼图对象使用另一个对象Fruit_Tile,我也试图制作parcellable。以下是该代码。
public class Fruit_Tile implements Parcelable
{
private Bitmap fruit;
private int x_Position;
private int y_Position;
public Fruit_Tile(Bitmap fruitInput, int x, int y)
{
fruit = fruitInput;
x_Position = x;
y_Position = y;
}
private Fruit_Tile(Parcel in)
{
fruit = Bitmap.CREATOR.createFromParcel(in);
x_Position = in.readInt();
y_Position = in.readInt();
}
public Bitmap getImage()
{
return fruit;
}
public void setImage(Bitmap input)
{
fruit = input;
}
public int getX_Position()
{
return x_Position;
}
public int getY_Position()
{
return y_Position;
}
public void setX_Position(int x) { x_Position = x; }
public void setY_Position(int y) { y_Position = y; }
public int describeContents()
{
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags)
{
fruit.writeToParcel(out, flags);
out.writeInt(x_Position);
out.writeInt(y_Position);
}
public static final Parcelable.Creator<Fruit_Tile> CREATOR = new Parcelable.Creator<Fruit_Tile>(){
public Fruit_Tile createFromParcel(Parcel in){
return new Fruit_Tile(in);
}
public Fruit_Tile[] newArray(int size){
return new Fruit_Tile[size];
}
};
}
当我调试并步骤时,按照
行startActivity(intent);
如果我不断步骤,程序最终会返回到Looper.java代码并循环。然后,我可以再次访问第一个活动的UI,然后重新开始整个过程。
为什么我的活动不是从这个putExtra行开始的?没有错误可言(我能找到)。 重申一下,如果putExtra被注释掉,活动将会启动。
我真的很感激一些帮助!
答案 0 :(得分:0)
当您尝试在包裹中写入空值时会发生这种情况。在以下代码段中,如果“名称字符串”为null,则将导致活动启动问题。
out.writeString(Name);
因此解决方案是,在声明时设置类数据成员的默认值。喜欢
String Name = "";
或者在写包裹时添加一个检查,如果它为空,则不要将其写在包裹中。像
if (Name != null) {
out.writeString(Name);
}