使用 Android Studio 和 Kotlin 插件,我找到了一种简单的方法来转换我的旧 Java Parcelables,没有额外的插件 (如果您只想将全新的 data 类变成 Parcelable,请跳到第 4 个代码 sn-p)。
假设您有一个 Person 类,其中包含所有 Parcelable 样板:
public class Person implements Parcelable{
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
private final String firstName;
private final String lastName;
private final int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
protected Person(Parcel in) {
firstName = in.readString();
lastName = in.readString();
age = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(firstName);
dest.writeString(lastName);
dest.writeInt(age);
}
@Override
public int describeContents() {
return 0;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
}
首先剥离Parcelable 实现,留下一个简单的、普通的、旧的Java 对象(属性应该是最终的并由构造函数设置):
public class Person {
private final String firstName;
private final String lastName;
private final int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
}
然后让Code > Convert Java file to Kotlin File 选项发挥它的魔力:
class Person(val firstName: String, val lastName: String, val age: Int)
将其转换为data 类:
data class Person(val firstName: String, val lastName: String, val age: Int)
最后,让我们再次把它变成Parcelable。将鼠标悬停在类名上,Android Studio 应该会为您提供Add Parcelable Implementation 的选项。结果应如下所示:
data class Person(val firstName: String, val lastName: String, val age: Int) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readString(),
parcel.readInt()
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(firstName)
parcel.writeString(lastName)
parcel.writeInt(age)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<Person> {
override fun createFromParcel(parcel: Parcel): Person {
return Person(parcel)
}
override fun newArray(size: Int): Array<Person?> {
return arrayOfNulls(size)
}
}
}
如您所见,Parcelable 实现是一些自动生成的代码,附加到您的 data 类定义中。
注意事项:
- 尝试将 Java
Parcelable 直接转换为 Kotlin 不会产生与当前版本的 Kotlin 插件相同的结果( 1.1.3)。
- 我不得不删除当前
Parcelable 代码生成器引入的一些额外的花括号。应该是小bug。
我希望这个技巧对你有用,对我也有用。