如何在活动之间传递一个double数组(boolean )?

我看不到要获得一个双布尔数组来传递给另一个活动。 我使用putExtra,当我检索它并将其转换为boolean[][] ,它声明它不能转换和崩溃。 但是,Boolean []有效。

我如何在活动之间传递boolean[][]

如果你绝对需要一个boolean [] [](并且不能只使用传递给Parcel.writeBooleanArray()的一个flat boolean []数组),那么正式的方法是将它包装在一个Parcelable类中在那里进行编组/解组。

我将草拟代码,虽然这没有经过测试,所以肯定存在一些问题。

 public class BooleanArrayArray implements Parcelable { private final boolean[][] mArray; public BooleanArrayArray(boolean[][] array) { mArray = array; } private BooleanArrayArray(Parcelable in) { boolean[][] array; final int N = in.readInt(); array = new boolean[][N]; for (int i=0; i CREATOR = new Parcelable.Creator() { public BooleanArrayArraycreateFromParcel(Parcel in) { return new BooleanArrayArray(in); } public BooleanArrayArray[] newArray(int size) { return new BooleanArrayArray[size]; } }; } 

如果你真的需要一个二维数组,你可以轻松地将一个二维数组转换为一个单维数组,以便在之间传递,如下所示:

 public boolean[] toOneDimension(boolean[][] input){ boolean[] output = new boolean[input.length * input[0].length]; for(int i = 0; i < input.length; i++){ for(int j = 0; j < input[i].length; j++){ output[i*j] = input[i][j]; } } return output; } 

然后您可以将其构建回二维数组,如下所示:

 public boolean[][] toTwoDimensions(int dimensions, boolean[] input){ boolean[][] output = new boolean[input.length / dimensions][dimensions]; for(int i = 0; i < input.length; i++){ output[i/dimensions][i % dimensions] = input[i]; } return output; } 

然后像这样使用:

 public static void main(String[] args){ int size = 10; Random rand = new Random(); Tester tester = new Tester(); //example code holder boolean[][] value = new boolean[size+1][size]; for(int i = 0; i < size+1; i++){ for(int j = 0; j < size; j++){ value[i][j] = rand.nextBoolean(); } } boolean [][] output = tester.toTwoDimensions(size, tester.toOneDimension(value)); for(int i = 0; i < size+1; i++){ for(int j = 0; j < size; j++){ assert value[i][j] == output[i][j]; } } } 

唯一的要求是在展平数组之前需要知道数组的维度。

这很老了,但对我帮助很大,所以我想分享我的发现。 我使用Parcelabler来制作我的Object Class Parcelable(因为我读过的所有内容都是用火星写的),然后我使用@John Ericksen的答案在我的Object Class中实现它,并使用一些方法使我的生活更轻松flattenMultiDimensionalArrayrestoreMultiDimensionalArray以及最后结果。

对于二维数组

MultiDimensionalArray .java

 public class MultiDimensionalArray implements Parcelable { private int[][] multiDimensionalArray; //Any other Variables, Objects public MultiDimensionalArray() { } public MultiDimensionalArray(int[][] multiDimensionalArray) { this.multiDimensionalArray = multiDimensionalArray; //Any other Variables, Objects } public int[][] getMultiDimensionalArray() { return multiDimensionalArray; } public void setMultiDimensionalArray(int[][] multiDimensionalArray) { this.multiDimensionalArray = multiDimensionalArray; } protected MultiDimensionalArray(Parcel in) { int rows = in.readInt(); int columns = in.readInt(); int[] transitionalArray = in.createIntArray(); multiDimensionalArray = restoreMultiDimensionalArray(transitionalArray, rows, columns); //Any other Variables, Objects } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { int rows = multiDimensionalArray.length; int columns = multiDimensionalArray[rows - 1].length; int[] transitionalArray = flattenMultiDimensionalArray(multiDimensionalArray); dest.writeInt(rows); dest.writeInt(columns); dest.writeIntArray(transitionalArray); //Any other Variables, Objects } public static final Creator CREATOR = new Creator() { @Override public MultiDimensionalArray createFromParcel(Parcel in) { return new MultiDimensionalArray(in); } @Override public MultiDimensionalArray[] newArray(int size) { return new MultiDimensionalArray[size]; } }; private int[] flattenMultiDimensionalArray(int[][] sourceCard) { int k = 0; int[] targetCard = new int[sourceCard.length * sourceCard[sourceCard.length - 1].length]; for (int[] aSourceCard : sourceCard) { for (int anASourceCard : aSourceCard) { targetCard[k] = anASourceCard; k++; } } return targetCard; } private int[][] restoreMultiDimensionalArray(int[] sourceCard, int rows, int columns) { int k = 0; int[][] multiDimensionalArray = new int[rows][columns]; for (int i = 0; i < multiDimensionalArray.length; i++) { for (int j = 0; j < multiDimensionalArray[multiDimensionalArray.length - 1].length; j++) { multiDimensionalArray[i][j] = sourceCard[k]; k++; } } return multiDimensionalArray; } 

}