在Android Q Beta中,从Parcel创建ContentValues对象时可能会导致对象为空。这是因为在Android Q中,Parcel内部的数据格式发生了变化。
要解决这个问题,可以使用以下方法来创建ContentValues对象:
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public ContentValues createFromParcel(Parcel in) {
return new ContentValues(in);
}
public ContentValues[] newArray(int size) {
return new ContentValues[size];
}
};
public ContentValues(Parcel in) {
// 从Parcel中读取数据并初始化对象
readFromParcel(in);
}
private void readFromParcel(Parcel in) {
// 读取数据并初始化对象
int size = in.readInt();
for (int i = 0; i < size; i++) {
String key = in.readString();
int valueType = in.readInt();
Object value = null;
switch (valueType) {
case VALUE_NULL:
break;
case VALUE_STRING:
value = in.readString();
break;
case VALUE_INTEGER:
value = in.readInt();
break;
case VALUE_FLOAT:
value = in.readFloat();
break;
case VALUE_LONG:
value = in.readLong();
break;
case VALUE_BOOLEAN:
value = in.readInt() != 0;
break;
// 添加其他类型的处理逻辑
}
// 将键值对添加到ContentValues对象中
put(key, value);
}
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// 将数据写入Parcel中
int size = size();
dest.writeInt(size);
for (Map.Entry entry : valueSet()) {
String key = entry.getKey();
Object value = entry.getValue();
int valueType;
if (value == null) {
valueType = VALUE_NULL;
} else if (value instanceof String) {
valueType = VALUE_STRING;
} else if (value instanceof Integer) {
valueType = VALUE_INTEGER;
} else if (value instanceof Float) {
valueType = VALUE_FLOAT;
} else if (value instanceof Long) {
valueType = VALUE_LONG;
} else if (value instanceof Boolean) {
valueType = VALUE_BOOLEAN;
} else {
valueType = VALUE_NULL;
}
// 写入键值对到Parcel中
dest.writeString(key);
dest.writeInt(valueType);
if (value != null) {
switch (valueType) {
case VALUE_STRING:
dest.writeString((String) value);
break;
case VALUE_INTEGER:
dest.writeInt((Integer) value);
break;
case VALUE_FLOAT:
dest.writeFloat((Float) value);
break;
case VALUE_LONG:
dest.writeLong((Long) value);
break;
case VALUE_BOOLEAN:
dest.writeInt((Boolean) value ? 1 : 0);
break;
// 添加其他类型的处理逻辑
}
}
}
}
通过以上步骤,您可以在Android Q Beta中正确地从Parcel创建ContentValues对象,并避免出现对象为空的问题。
上一篇:Android Q 背景限制