【问题标题】:Android: putExtra parcelable stops activity launching. No errorAndroid:putExtra parcelable 停止活动启动。没有错误
【发布时间】:2017-03-21 13:08:32
【问题描述】:

我正在尝试制作一个应用程序,此时我正在应用程序中启动一个活动,并向活动添加一些可打包的附加功能。但是,随着我的附加功能的添加,意图将不会启动活动。注释 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 被注释掉,活动将启动。

非常感谢您的帮助!

【问题讨论】:

  • puzOut 是什么?字符串或其他任何东西
  • 这是一个 Puzzle 对象,抱歉 :) 现在在问题中澄清它。

标签: java android android-intent parcelable parcel


【解决方案1】:

当您尝试在包裹中写入空值时会发生这种情况。在下面的代码 sn-p 中,如果名称字符串为空,则会导致活动启动问题。

out.writeString(Name);

所以解决方法是,要么在声明时设置类数据成员的默认值。喜欢

  String Name = "";

或者在写入包裹时添加一个检查,如果它为空,那么不要将它写入包裹中。喜欢

if (Name != null) {
     out.writeString(Name);
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    相关资源
    最近更新 更多