代码之家  ›  专栏  ›  技术社区  ›  Chud37

如何在中创建地块?

  •  0
  • Chud37  · 技术社区  · 7 年前

    我有一个叫做music文件的类,它的构造函数是:

    protected MusicFile(Parcel in) {
            Title = in.readString();
            Album = in.readString();
            Artist = in.readString();
            Path = in.readString();
            Genre = in.readString();
            Data = in.readString();
            artistID = in.readInt();
            if (in.readByte() == 0) {
                AlbumID = null;
            } else {
                AlbumID = in.readLong();
            }
            albumCover = in.readParcelable(Uri.class.getClassLoader());
        }
    

    Parcelable ,我不能只是创建一个新的 MusicFile

    MusicFile musicFile = new MusicFile();

    因为它需要 Parcel In .

    现在如何创建新的音乐文件?我试过以下方法:

    `

    MusicFile MusicFile=新音乐文件(包裹); `

    然而,这似乎不起作用。我得到以下错误: 'Parcel(long)' is not public in 'android.os.Parcel'. Cannot be accessed from outside package

    2 回复  |  直到 7 年前
        1
  •  1
  •   Arthur Attout    7 年前

    你可以延长 Parcelable 保留默认构造函数

    import android.os.Parcel;
    import android.os.Parcelable;
    
    
    public class MusicFile implements Parcelable {
    
        private Integer id;
        private String title;
        ...
    
        public MusicFile(Integer id, String title) {
            this.id = id;
            this.title = title;
        }
    
        public MusicFile(){
    
        }
    
        protected MusicFile(Parcel in) {
            id = in.readByte() == 0x00 ? null : in.readInt();
            title = in.readString();
        }
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            if (id == null) {
                dest.writeByte((byte) (0x00));
            } else {
                dest.writeByte((byte) (0x01));
                dest.writeInt(id);
            }
            dest.writeString(title);
        }
    
        @SuppressWarnings("unused")
        public static final Parcelable.Creator<MusicFile> CREATOR = new Parcelable.Creator<MusicFile>() {
            @Override
            public MusicFile createFromParcel(Parcel in) {
                return new MusicFile(in);
            }
    
            @Override
            public MusicFile[] newArray(int size) {
                return new MusicFile[size];
            }
        };
    }
    

    班级 Parcel 当您以包的形式传递对象时,由Android处理 bundle.addParcelableExtra(...) . 你不应该试图独自处理这些事情。当你打电话的时候 addParcelableExtra() Android使用这些方法( writeToParcel describeContents 等)来序列化对象,但是 . 您应该添加这些方法来帮助Android自动序列化您的对象(并使您免于许多痛苦),但是您保留了标准构造函数、getter/setter等。

        2
  •  0
  •   Umair windleafs    7 年前

    您需要为parcelable创建一个空构造函数。您的模型现在应该如下所示:

     public static final Creator<MusicFile> CREATOR = new Creator<MusicFile>() {
        @Override
        public MusicFilecreateFromParcel(Parcel in) {
            return new MusicFile(in);
        }
    
        @Override
        public ClassModelInfo[] newArray(int size) {
            return new ClassModelInfo[size];
        }
    };
    
    // It's an empty constructor for parcelable 
    private MusicFile() {
    
    }
    
    // This constructor is what parcel generates.
    protected MusicFile(Parcel in) {
            Title = in.readString();
            Album = in.readString();
            Artist = in.readString();
            Path = in.readString();
            Genre = in.readString();
            Data = in.readString();
            artistID = in.readInt();
            if (in.readByte() == 0) {
                AlbumID = null;
            } else {
                AlbumID = in.readLong();
            }
            albumCover = in.readParcelable(Uri.class.getClassLoader());
        }
    
        3
  •  0
  •   JoseF    5 年前

    你可以用 Parcel.obtain() Parcel . 别忘了做

    包裹回收()

    用完之后。