如何使用Bundle在Activity之间传递一个Uri数组

And*_*eaF 5 android android-intent android-activity

我需要将一个Uri数组传递给另一个活动,传递一个我简单使用的String数组

String[] images=getImagesPathString();

    Bundle b = new Bundle();
    b.putStringArray("images", images);
Run Code Online (Sandbox Code Playgroud)

但是使用一组Uri

 Uri[] imagesUri=getImagesUri();
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为在Bundle中没有方法"putUri(Uri x)"

我怎么能解决这个问题?

mar*_*inj 6

据我所知,普通数组不能放入Bundles.但您可以将Uri-s放入ArrayList,然后调用Bundle.putParcelableArrayList().

例:

 ArrayList<Uri> uris = new ArrayList<Uri>();
 // fill uris
 bundle.putParcelableArrayList(KEY_URIS, uris);
Run Code Online (Sandbox Code Playgroud)

稍后的:

    ArrayList<Parcelable> uris =
            bundle.getParcelableArrayList(KEY_URIS);
    for (Parcelable p : uris) {
        Uri uri = (Uri) p;
    }
Run Code Online (Sandbox Code Playgroud)


nse*_*iuk 4

您应该研究 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];
    }
};
Run Code Online (Sandbox Code Playgroud)