Java 如何在活动之间传递自定义类
我找到了许多简单的解决方案(例如Intent.putExtra(String,String)和Bundle.putString(String,String)),但这对我的情况没有帮助 我有一个名为MyMP3的类,它包含非基本类型。我需要通过我的MP3的以下Java 如何在活动之间传递自定义类,java,android,android-layout,Java,Android,Android Layout,我找到了许多简单的解决方案(例如Intent.putExtra(String,String)和Bundle.putString(String,String)),但这对我的情况没有帮助 我有一个名为MyMP3的类,它包含非基本类型。我需要通过我的MP3的以下 private AudioFile audioFile; private Tag tag; private int index; private boolean saved, startedWithLyrics; private String
private AudioFile audioFile;
private Tag tag;
private int index;
private boolean saved, startedWithLyrics;
private String id3lyrics;
AudioFile和Tag都是我从.jar文件导入的类。我如何通过意向将这些信息传递给其他活动?我尝试为我的“MyMP3”类实现Parcelable,但我不确定在不传递基元类型时如何正确使用这些方法
你能帮我看看下面的代码,并告诉我如何在像我这样的自定义类中正确使用Parcelable吗?如何在writeToParcel函数中设置包裹,以及如何在其他活动中正确检索该类
下面是我的代码(至少是重要的部分)。几天来我一直在尝试不同的事情,但我无法让它发挥作用。请帮帮我
public class MyMP3 extends AudioFile implements Parcelable
{
private AudioFile audioFile;
private Tag tag;
private int index;
private boolean saved, startedWithLyrics;
private String id3lyrics;
public MyMP3(File f, int index)
{
this.audioFile = AudioFileIO.read(f);
this.tag = this.audioFile.getTag();
this.index = index;
this.saved = false;
this.id3lyrics = getLyrics();
}
@Override
public int describeContents()
{
return 0;
}
@Override
public void writeToParcel(Parcel out, int flats)
{
/* This method does not work, but I do not know how else to implement it */
Object objects[] = {this.audioFile, this.tag, this.index, this.saved, this.startedWithLyrics, this.id3lyrics};
out.writeArray(objects);
}
public static final Parcelable.Creator<MyMP3> CREATOR = new Parcelable.Creator<MyMP3>()
{
public MyMP3 createFromParcel(Parcel in)
{
/* Taken from the Android Developer website */
return new MyMP3(in);
}
public MyMP3[] newArray(int size)
{
/* Taken from the Android Developer website */
return new MyMP3[size];
}
};
private MyMP3(Parcel in)
{
/* This method probable needs changed as well */
Object objects[] = in.readArray(MyMP3.class.getClassLoader());
}
公共类MyMP3扩展音频文件实现可打包
{
私有音频文件;
私人标签;
私有整数索引;
保存私有布尔值,以歌词开始;
私有字符串ID3歌词;
公共MyMP3(文件f,int索引)
{
this.audioFile=AudioFileIO.read(f);
this.tag=this.audioFile.getTag();
这个指数=指数;
this.saved=false;
this.id3lysts=getlysts();
}
@凌驾
公共int描述内容()
{
返回0;
}
@凌驾
公共无效写入包裹(包裹外,内部公寓)
{
/*这个方法不起作用,但我不知道如何实现它*/
Object objects[]={this.audioFile,this.tag,this.index,this.saved,this.startedwithlysts,this.id3lysts};
out.writeArray(对象);
}
public static final Parcelable.Creator=新建Parcelable.Creator()
{
公共MyMP3 createFromParcel(包裹中)
{
/*摘自Android开发者网站*/
返回新的MyMP3(in);
}
公共MyMP3[]新数组(整数大小)
{
/*摘自Android开发者网站*/
返回新的MyMP3[大小];
}
};
私人MyMP3(包裹内)
{
/*这种方法可能也需要改变*/
Object objects[]=in.readArray(MyMP3.class.getClassLoader());
}
}你可以像这样把你的MyMP3类包裹起来。确保读/写顺序正确。非原语也必须是可包裹的,因此您可能无法控制这一点。或者,您也可以提出自己的序列化/反序列化。您可以使用文本格式,如JSON或XML。另一种选择是使用子类应用程序(确保在清单中声明它),并将其用作挂起跨活动的对象的位置。这会在应用程序的生命周期中将对象保留在内存中,因此请小心操作。是否为AudioFile/Tag primitive的成员?如果是这样,您也许可以在项目中扩展AudioFile和标记,并为这些对象实现parcelable,然后在主项目中使用它们。