我正在尝试创建一个应用程序,在应用程序的这一点上,我正在启动一个活动,并为活动添加一些可插入的额外内容。但是,随着我的额外内容的添加,意图将无法启动活动。注释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,我也尝试过这个对象。下面是代码。
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被注释掉,活动将会启动。
我真的很感激一些帮助!
当您尝试在宗地中写入空值时会发生这种情况。在以下代码片段中,如果Name String为null,则会导致活动启动问题。
out.writeString(Name);
因此解决方案是,在声明时设置类数据成员的默认值。喜欢
String Name = "";
或者在写入parcel时添加一个检查,如果它为null,则不要将其写入parcel。喜欢
if (Name != null) {
out.writeString(Name);
}