2013-05-10 2 views
-2

У меня есть полный код, скопированный как файл от android.preference.MultiSelectListPreference. Я столкнулся странные ошибки компиляции для следующего внутреннего класса:Ошибка Android класса Parcel

линии # 1, исходный код и я добавил #line 2

Для линии # 2

Несоответствие типа: не удается преобразовать из аннулированным String []

и для раскомментировать линии # 1

Множественные маркеры на этой линии - несоответствие типов: невозможно преобразовать из пустоты в строку [] - Метод readStringArray (String []) в типе посылки не применяется для аргументов()

private static class SavedState extends BaseSavedState { 
     Set<String> values; 

     public SavedState(Parcel source) { 
      super(source); 
      values = new HashSet<String>(); 
      //String[] strings = source.readStringArray(); //Line #1 
      String[] strings = source.readStringArray(values.toArray(new String[0])); //Line #2 

      final int stringCount = strings.length; 
      for (int i = 0; i < stringCount; i++) { 
       values.add(strings[i]); 
      } 
     } 

     public SavedState(Parcelable superState) { 
      super(superState); 
     } 

     @Override 
     public void writeToParcel(Parcel dest, int flags) { 
      super.writeToParcel(dest, flags); 
      dest.writeStringArray(values.toArray(new String[0])); 
     } 

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

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

Я действительно удивлен этими ошибками компиляции! Я на самом деле пишу свое предпочтение с несколькими избранными, но сталкиваюсь с одной и единственной ошибкой, изложенной выше, и не имею понятия, как ее решить.

Цените любую помощь.

+1

прочитайте документацию ... http://developer.android.com/reference/android/os/Parcel.html#readStringArray(java.lang.String[])если вы все еще не читаете ее снова. . и опять ... – Selvin

ответ

2

Метод readStringArray() не имеет возвращаемого значения, поэтому компилятор жалуется. Вам необходимо передать ему строковый массив в качестве параметра и заполнить массив строк, который вы ему даете.

Вы называете readStringArray() как это:

String [] вещи = новый String [5]; // Известно, что массив в пакете имеет 5 элементов source.readStringArray (вещи);

Это ТОЛЬКО работает, если вы точно знаете, насколько велик массив строк в посылке. Если массив всегда имеет фиксированный размер, вы можете использовать его. Если нет, вам нужно будет написать размер массива в Parcelдо, который вы напишете массив, а затем читатель Parcel может сначала прочитать размер массива, а затем создать подходящий размерный массив, чтобы получить данные.