我需要将 Uri 数组传递给另一个活动,以传递我简单使用的字符串数组
String[] images=getImagesPathString();
Bundle b = new Bundle();
b.putStringArray("images", images);
但是使用 Uri 数组
Uri[] imagesUri=getImagesUri();
这不起作用,因为 Bundle 中没有方法“putUri(Uri x)”
我该如何解决这个问题?
我需要将 Uri 数组传递给另一个活动,以传递我简单使用的字符串数组
String[] images=getImagesPathString();
Bundle b = new Bundle();
b.putStringArray("images", images);
但是使用 Uri 数组
Uri[] imagesUri=getImagesUri();
这不起作用,因为 Bundle 中没有方法“putUri(Uri x)”
我该如何解决这个问题?
据我所知,普通数组不能放入 Bundles 中。但是你可以把 Uri-s 放到 ArrayList 中,然后调用 Bundle.putParcelableArrayList()。
例子:
ArrayList<Uri> uris = new ArrayList<Uri>();
// fill uris
bundle.putParcelableArrayList(KEY_URIS, uris);
稍后的:
ArrayList<Parcelable> uris =
bundle.getParcelableArrayList(KEY_URIS);
for (Parcelable p : uris) {
Uri uri = (Uri) p;
}
您应该查看 Parcelable 界面以了解如何通过意图传递事物
http://developer.android.com/intl/es/reference/android/os/Parcelable.html
也许您可以实现一个实现该接口的 ParcelableUri 类。
像这样(未经测试!!):
public class ParcelableUri implements Parcelable {
private Uri[] uris;
public ParcelableUri(Parcel in) {
Uri.Builder builder = new Uri.Builder();
int lenght = in.readInt();
for(int i=0; i<=lenght; i++){
uris[i]= builder.path(in.readString()).build();
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(uris.length);
for(int i=0; i<=uris.length; i++){
dest.writeString(uris[i].toString());
}
}
public static final Parcelable.Creator<ParcelableUri> CREATOR = new Parcelable.Creator<ParcelableUri>() {
public ParcelableUri createFromParcel(Parcel in) {
return new ParcelableUri(in);
}
public ParcelableUri[] newArray(int size) {
return new ParcelableUri[size];
}
};
Uri 不是可包裹的吗?您可以尝试创建一个可打包元素(Uri)数组并将其放入 Bundle 中。
您可以使用 JSONObject 包装任何对象并快速对其进行字符串化。从字符串返回到 JSON 真的很简单
你可以这样做...
private Uri[] getUris(int requestCode, Intent data) {
Uri[] uris;
ClipData clipData = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
clipData = data.getClipData();
}
if(clipData != null) {
uris = new Uri[clipData.getItemCount()];
for(int i=0;i<clipData.getItemCount();i++) {
ClipData.Item videoItem = clipData.getItemAt(i);
Uri videoURI = videoItem.getUri();
uris[i] = videoURI;
}
}
else {
uris = new Uri[0];
Uri videoURI = data.getData();
uris[0] = videoURI;
}
return uris;
}