我有一个活动,启动时需要访问两个不同的数组列表。两个列表都是我自己创建的不同对象。
基本上,我需要一种方法来将这些对象从Intent传递给活动。我可以使用addExtras(),但这需要一个Parceable兼容类。我可以使我的类传递序列化,但据我所知,这减慢了程序。
我有什么选择?
我可以传递一个Enum吗?
题外话:有没有一种方法可以将参数从Intent传递给Activity构造函数?
我有一个活动,启动时需要访问两个不同的数组列表。两个列表都是我自己创建的不同对象。
基本上,我需要一种方法来将这些对象从Intent传递给活动。我可以使用addExtras(),但这需要一个Parceable兼容类。我可以使我的类传递序列化,但据我所知,这减慢了程序。
我有什么选择?
我可以传递一个Enum吗?
题外话:有没有一种方法可以将参数从Intent传递给Activity构造函数?
当前回答
您可以将枚举作为字符串传递。
public enum CountType {
ONE,
TWO,
THREE
}
private CountType count;
count = ONE;
String countString = count.name();
CountType countToo = CountType.valueOf(countString);
给定字符串的支持,你应该能够传递枚举的值没有问题。
其他回答
要按意图传递枚举,可以将enum转换为整数。
Ex:
public enum Num{A ,B}
发送(enum to integer):
Num send = Num.A;
intent.putExtra("TEST", send.ordinal());
接收(整数到enum):
Num rev;
int temp = intent.getIntExtra("TEST", -1);
if(temp >= 0 && temp < Num.values().length)
rev = Num.values()[temp];
致以最亲切的问候。 :)
你可以让你的枚举实现Parcelable,这对枚举来说非常简单:
public enum MyEnum implements Parcelable {
VALUE;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(final Parcel dest, final int flags) {
dest.writeInt(ordinal());
}
public static final Creator<MyEnum> CREATOR = new Creator<MyEnum>() {
@Override
public MyEnum createFromParcel(final Parcel source) {
return MyEnum.values()[source.readInt()];
}
@Override
public MyEnum[] newArray(final int size) {
return new MyEnum[size];
}
};
}
然后你可以使用Intent。Parcelable putExtra(字符串)。
更新:请注意沉船的评论,枚举.values()分配一个新的数组在每次调用。
更新:Android Studio提供了一个实时模板ParcelableEnum来实现这个解决方案。(在Windows上,使用Ctrl+J)
使用Kotlin扩展函数
inline fun <reified T : Enum<T>> Intent.putExtra(enumVal: T, key: String? = T::class.qualifiedName): Intent =
putExtra(key, enumVal.ordinal)
inline fun <reified T: Enum<T>> Intent.getEnumExtra(key: String? = T::class.qualifiedName): T? =
getIntExtra(key, -1)
.takeUnless { it == -1 }
?.let { T::class.java.enumConstants[it] }
这使您可以灵活地传递多个相同的枚举类型,或者默认使用类名。
// Add to gradle
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
// Import the extension functions
import path.to.my.kotlin.script.putExtra
import path.to.my.kotlin.script.getEnumExtra
// To Send
intent.putExtra(MyEnumClass.VALUE)
// To Receive
val result = intent.getEnumExtra<MyEnumClass>()
我认为最好的办法是将这些列表转换为一些可打包的东西,如字符串(或映射?),以将其传递给活动。然后Activity将不得不将其转换回数组。
实现自定义包装是一个痛苦的脖子,所以我将尽可能避免它。
不要使用枚举。不使用枚举的第78个理由。:)使用整数,可以通过Bundle和Parcelable轻松远程。