Android Parcel类错误

时间:2013-05-10 12:06:11

标签: android android-preferences

我已完成从android.preference.MultiSelectListPreference复制的完整代码。我面临以下内部类的奇怪编译错误:

第1行是原始代码,我添加了#Line 2

对于第2行

  

类型不匹配:无法从void转换为String []

和 对于未注释的Line#1

  

此行有多个标记      - 类型不匹配:无法从void转换为String []      - Parcel类型中的方法readStringArray(String [])不适用于arguments()

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 个答案:

答案 0 :(得分:2)

方法readStringArray()没有返回值,这就是编译器抱怨的原因。你需要传递一个字符串数组作为参数,它填充你给它的字符串数组。

您可以像这样致电readStringArray()

String [] things = new String [5]; //已知包裹中的数组有5个元素    source.readStringArray(事);

如果您确切知道包裹中的字符串数组有多大,这只会起作用。如果数组总是固定大小,您可以使用它。如果没有,您需要在编写数组之前将数组的大小写入Parcel 之前,然后Parcel的读者可以先读取大小数组,然后创建一个适当大小的字符串数组来接收数据。