2012-03-05 42 views
1

我看不到得到一個雙布爾數組傳遞給另一個活動。我使用putExtra,當我檢索它並將其轉換爲boolean[][]時,它指出它不能投射並崩潰。然而,布爾[]工作。如何在活動之間傳遞雙數組(布爾[] [])?

我該怎麼辦在活動之間通過boolean[][]

+0

你知道你的2維布爾的確切尺寸? – 2012-03-05 05:15:28

+0

是的,在這種情況下它是一個3x3的矩陣,但在未來我希望它是動態的。 – SolidSnake4444 2012-03-05 05:26:33

回答

3

如果你絕對需要一個布爾[] [](並不能做到這一點,只需平布爾[]數組傳遞給Parcel.writeBooleanArray()),那麼正式的方式做,這是將其包裝在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<N; i++) { 
      array[i] = in.createBooleanArray(); 
     } 
     mArray = array; 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel out, int flags) { 
     final int N = mArray.length; 
     out.writeInt(N); 
     for (int i=0; i<N; i++) { 
      out.writeBooleanArray(mArray[i]); 
     } 
    } 

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

     public BooleanArrayArray[] newArray(int size) { 
      return new BooleanArrayArray[size]; 
     } 
    }; 
} 
+0

我已經出去所以我還沒有機會嘗試這個,但我會給這個鏡頭,因爲這似乎是對我來說最好的方法,因爲我很可能需要二維數組。如果我遇到問題,我會問,如果它的工作,讓我讓你知道並接受。 – SolidSnake4444 2012-03-13 18:38:16

+0

我一直無法測試這個,因爲我失去了這個程序。然而,看看代碼,這似乎是可行的。我接受這個答案。 – SolidSnake4444 2013-02-21 17:54:16

-1

在您的一個活動中創建一個公共靜態方法,該方法返回所需的布爾值[] []。現在您可以通過整個項目從任何其他活動/類訪問此方法。 請參閱以下示例。

public class myActivity extends Activity 
{ 

    private static boolean[][] myBooleanVar; 
    .... 
    .... 
    .... 

    public static boolean[][] getBooleanArray() 
    { 
     return myBooleanVar; 
    } 
} 
+0

我認爲一個更好的方法是使用應用程序實例來保存變量或可能是一個單身人士。第二個想法,我不知道你可以通過靜態方法公開這個變量,因爲變量是非靜態的。 – 2012-03-05 05:23:29

+0

對不起,這是一個代碼錯誤,看我更新了我的代碼。 – Android 2012-03-05 05:25:39

+2

您應該永遠不要使用這些建議中的任何一個,因爲在任何時候您的流程都會死亡,您將丟失這些數據。 – hackbod 2012-03-05 05:26:16

1

如果你真的需要一個2維數組,你可以輕鬆地將二維數組轉換成一維數組活動之間傳遞,像這樣:

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; 
} 

然後你就可以建立回一個2維陣列像這樣:

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]; 
     } 
    } 


} 

唯一的要求是您在展平數組之前需要知道數組的維數。

0

這是舊的,但幫助了我很多,所以我想分享我的發現。 我使用Parcelabler來使我的對象類Parcelable(因爲我讀的所有東西都是用火星語寫給我的),然後我用@John Ericksen的答案在我的對象類中實現它,並使我的生活更輕鬆flattenMultiDimensionalArrayrestoreMultiDimensionalArray以及最終的結果。

對於一個2維數組

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<MultiDimensionalArray> CREATOR = new Creator<MultiDimensionalArray>() { 

    @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; 
} 

}