Android 번들에 Enum 객체를 어떻게 추가합니까?
Android 번들에 Enum 객체를 어떻게 추가합니까?
답변:
열거 형은 직렬화 가능하므로 문제가 없습니다.
다음 열거가 주어지면 :
enum YourEnum {
TYPE1,
TYPE2
}
묶음:
// put
bundle.putSerializable("key", YourEnum.TYPE1);
// get
YourEnum yourenum = (YourEnum) bundle.get("key");
의지:
// put
intent.putExtra("key", yourEnum);
// get
yourEnum = (YourEnum) intent.getSerializableExtra("key");
outState.putSerializable("trollData", game.getFunkyTrolls());
loading : game.setFunkyTrolls((Game.FunkyTroll[]) savedInstanceState.getSerializable("trollData"));
?
ClassNotFoundException
나는 이것이 오래된 질문이라는 것을 알고 있지만 같은 문제가 발생하여 어떻게 해결했는지 공유하고 싶습니다. 핵심은 Miguel이 말한 것입니다. 열거 형은 직렬화 가능합니다.
다음 열거가 주어지면 :
enum YourEnumType {
ENUM_KEY_1,
ENUM_KEY_2
}
놓다:
Bundle args = new Bundle();
args.putSerializable("arg", YourEnumType.ENUM_KEY_1);
나는 kotlin을 사용합니다.
companion object {
enum class Mode {
MODE_REFERENCE,
MODE_DOWNLOAD
}
}
그런 다음 의도에 넣습니다.
intent.putExtra(KEY_MODE, Mode.MODE_DOWNLOAD.name)
당신이 가치를 얻기 위해 그물 때 :
mode = Mode.valueOf(intent.getStringExtra(KEY_MODE))
.name
매우 중요한 경로는
.name
in의 사용을 피하는 것처럼 확장 방법이 필요한지 확실하지 않습니다 putString()
. Kotlin에서는을 사용하면 이미 간소화되었습니다 .apply
. 예 :ContentFragment.newInstance(Bundle().apply { putString(FEED_TYPE_KEY, SAVED.name) })
bundle.putEnum(key, enum) | bundle.getEnum<>(key)
myEnumValue.name ()에서 문자열로 전달하고 YourEnums.valueOf (s)에서 복원하는 것이 좋습니다. 그렇지 않으면 열거의 순서가 유지되어야합니다!
더 긴 설명 : 열거 형 서수에서 열거 형으로 변환
다른 옵션 :
public enum DataType implements Parcleable {
SIMPLE, COMPLEX;
public static final Parcelable.Creator<DataType> CREATOR = new Creator<DataType>() {
@Override
public DataType[] newArray(int size) {
return new DataType[size];
}
@Override
public DataType createFromParcel(Parcel source) {
return DataType.values()[source.readInt()];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.ordinal());
}
}
putSerializable(key, value)
/ (Type) getSerializable(key)
또는 putString(key, value.name())
/ 를 사용할 수 있습니다 Type.valueOf(getString(key))
. 여기에서 Parcelable 구현은 중복적이고 무의미합니다.
Parcelable
은 열거 형 값의 배열을 저장하는 좋은 솔루션입니다.
bundle.putSerializable (String key, Serializable s) 및 bundle.getSerializable (String key)을 사용하십시오.
enum Mode = {
BASIC, ADVANCED
}
Mode m = Mode.BASIC;
bundle.putSerializable("mode", m);
...
Mode m;
m = bundle.getSerializable("mode");
설명서 : http://developer.android.com/reference/android/os/Bundle.html
들어 의향 이 방법을 사용할 수 있습니다 :
의도 : 코 틀린
FirstActivity :
val intent = Intent(context, SecondActivity::class.java)
intent.putExtra("type", typeEnum.A)
startActivity(intent)
두 번째 활동 :
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//...
val type = (intent.extras?.get("type") as? typeEnum.Type?)
}
한 가지 알아야 할 - 당신이 사용하는 경우 bundle.putSerializable
A는 대한 Bundle
통지에 추가하려면 다음 문제로 실행할 수 있습니다 :
*** Uncaught remote exception! (Exceptions are not yet supported across processes.)
java.lang.RuntimeException: Parcelable encountered ClassNotFoundException reading a Serializable object.
...
이 문제를 해결하려면 다음을 수행하십시오.
public enum MyEnum {
TYPE_0(0),
TYPE_1(1),
TYPE_2(2);
private final int code;
private MyEnum(int code) {
this.code = navigationOptionLabelResId;
}
public int getCode() {
return code;
}
public static MyEnum fromCode(int code) {
switch(code) {
case 0:
return TYPE_0;
case 1:
return TYPE_1;
case 2:
return TYPE_2;
default:
throw new RuntimeException(
"Illegal TYPE_0: " + code);
}
}
}
다음과 같이 사용할 수 있습니다.
// Put
Bundle bundle = new Bundle();
bundle.putInt("key", MyEnum.TYPE_0.getCode());
// Get
MyEnum myEnum = MyEnum.fromCode(bundle.getInt("key"));
간단한 방법으로 정수 값을 열거 형에 할당하십시오.
다음 예를 참조하십시오.
public enum MyEnum {
TYPE_ONE(1), TYPE_TWO(2), TYPE_THREE(3);
private int value;
MyEnum(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
발신자 측 :
Intent nextIntent = new Intent(CurrentActivity.this, NextActivity.class);
nextIntent.putExtra("key_type", MyEnum.TYPE_ONE.getValue());
startActivity(nextIntent);
수신기 측 :
Bundle mExtras = getIntent().getExtras();
int mType = 0;
if (mExtras != null) {
mType = mExtras.getInt("key_type", 0);
}
/* OR
Intent mIntent = getIntent();
int mType = mIntent.getIntExtra("key_type", 0);
*/
if(mType == MyEnum.TYPE_ONE.getValue())
Toast.makeText(NextActivity.this, "TypeOne", Toast.LENGTH_SHORT).show();
else if(mType == MyEnum.TYPE_TWO.getValue())
Toast.makeText(NextActivity.this, "TypeTwo", Toast.LENGTH_SHORT).show();
else if(mType == MyEnum.TYPE_THREE.getValue())
Toast.makeText(NextActivity.this, "TypeThree", Toast.LENGTH_SHORT).show();
else
Toast.makeText(NextActivity.this, "Wrong Key", Toast.LENGTH_SHORT).show();
Koltin 확장을 만들었습니다.
fun Bundle.putEnum(key: String, enum: Enum<*>) {
this.putString( key , enum.name )
}
inline fun <reified T: Enum<T>> Intent.getEnumExtra(key:String) : T {
return enumValueOf( getStringExtra(key) )
}
번들을 작성하고 추가하십시오.
Bundle().also {
it.putEnum( "KEY" , ENUM_CLAS.ITEM )
}
그리고 얻다:
intent?.getEnumExtra< ENUM_CLAS >( "KEY" )?.let{}