-2

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

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

对于第 2 行

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

和未注释的第 1 行

此行有多个标记 - 类型不匹配:无法从 void 转换为 String[] - Parcel 类型中的方法 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];
            }
        };
    }

我真的被这些编译错误逗乐了!我实际上正在编写自己的多选首选项,但面临上述唯一一个错误并且不知道解决它。

感谢任何帮助。

4

1 回答 1

2

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

readStringArray()这样打电话:

字符串 [] 事物 = 新字符串 [5]; // 已知包中的数组有 5 个元素 source.readStringArray(things);

仅当您确切知道包裹中的字符串数组有多大时,这才有效。如果数组始终具有固定大小,则可以使用它。如果没有,则需要在写入数组Parcel 之前将数组的大小写入,然后读取器Parcel可以先读取数组的大小,然后创建一个大小合适的字符串数组来接收数据。

于 2013-05-10T16:49:24.610 回答