Android 为自定义二维阵列实现Parcelable

Android 为自定义二维阵列实现Parcelable,android,android-intent,nullpointerexception,parcelable,Android,Android Intent,Nullpointerexception,Parcelable,为了在一个新的活动中传递我的2D数组,我提出了一种方法来包装它并实现Parcelable接口。不幸的是,当我使用Intent.getParcelableExtra时,我得到了java.lang.NullPointerException,这意味着我肯定没有正确实现接口。下面是我的更新的代码 public class MazeMapParcelable implements Parcelable { private Cell[][] mazeMap; public MazeMapParcelabl

为了在一个新的活动中传递我的2D数组,我提出了一种方法来包装它并实现Parcelable接口。不幸的是,当我使用
Intent.getParcelableExtra
时,我得到了
java.lang.NullPointerException
,这意味着我肯定没有正确实现接口。下面是我的更新的代码

public class MazeMapParcelable implements Parcelable
{
private Cell[][] mazeMap;

public MazeMapParcelable(Cell[][] mazeMap)
{
    this.mazeMap = mazeMap;
}

public Cell[][] getMazeMap()
{
    return this.mazeMap;
}


public static final Parcelable.Creator<MazeMapParcelable> CREATOR
        = new Creator<MazeMapParcelable>() {
    public MazeMapParcelable createFromParcel(Parcel in)
    {
        return new MazeMapParcelable(in);
    }

    public MazeMapParcelable[] newArray(int size)
    {
        return new MazeMapParcelable[size];
    }
};

public void writeToParcel(Parcel dest, int flags)
{
    int width = mazeMap.length;
    dest.writeInt(width);
    int height = mazeMap[1].length;
    dest.writeInt(height);

    for(int i=0;i<width;i++)
    {
        for(int j=0;j<height;j++)
        {
            dest.writeInt(mazeMap[i][j].getCordX());
            dest.writeInt(mazeMap[i][j].getCordY());
            dest.writeByte((byte) (mazeMap[i][j].getNorthWall() ? 1 : 0));
            dest.writeByte((byte) (mazeMap[i][j].getSouthWall() ? 1 : 0));
            dest.writeByte((byte) (mazeMap[i][j].getEastWall() ? 1 : 0));
            dest.writeByte((byte) (mazeMap[i][j].getWestWall() ? 1 : 0));
        }
    }
}

public int describeContents()
{
    return 0;
}

public MazeMapParcelable[] newArray(int size)
{
    return new MazeMapParcelable[size];
}

private MazeMapParcelable(Parcel in)
{
    int width = in.readInt();
    int height = in.readInt();
    Cell[][] recreatedMazeMap = new Cell[width][height];

    for(int i=0;i<width;i++)
    {
        for(int j=0;j<height;j++)
        {
            int cordX = in.readInt();
            int cordY = in.readInt();
            boolean northWall = in.readByte() != 0;
            boolean southWall = in.readByte() != 0;
            boolean westWall = in.readByte() != 0;
            boolean eastWall = in.readByte() != 0;
            Cell currCell = new Cell(cordX,cordY,northWall,southWall,westWall,eastWall);
            recreatedMazeMap[i][j] = currCell;
        }
    }
    mazeMap = recreatedMazeMap;
}

更新我不再出现空指针异常,但我的数据没有正确写入。(
parceableMazeMap[0][0]!=originalMazeMap[0][0]

也许您想研究一下如何使用。如果在单元格对象中实现Parcelable,则可以使用WriteTypedaray()将其保存到地块中


当包裹试图重新创建实例时,它调用此构造函数:

private MazeMapParcelable(Parcel in){
    ...
}
但在这一点上,您从未实际初始化过数组。因此它仍将处于此状态(为null):

由于此状态下的mazeMap未初始化,因此它将没有长度。因此,此代码不会提供您期望的值:

int width = this.mazeMap.length;
int height = this.mazeMap[1].length;

尝试将宽度和高度值作为包裹中的第一个项目写入,然后在重新创建包裹时读取它们。

我在更新中发布了我的代码,引用了您的建议(如果我理解正确的话)。我一直得到nullPointerException,尽管我遵循了您的说明,但仍然存在相同的问题(我已经根据您的说明更新了我的代码)。我遗漏了什么吗?嗯,好吧…从堆栈跟踪中,哪个对象是空的?如果它是mazemapparecable,那么可能在意图中根本不存在to extra。
private Cell[][] mazeMap;
int width = this.mazeMap.length;
int height = this.mazeMap[1].length;