एंड्रॉइड बंडल में आप एनम ऑब्जेक्ट कैसे जोड़ते हैं?
एंड्रॉइड बंडल में आप एनम ऑब्जेक्ट कैसे जोड़ते हैं?
जवाबों:
Enums Serializable हैं इसलिए कोई समस्या नहीं है।
निम्नलिखित एनम को देखते हुए:
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());
लोडिंग game.setFunkyTrolls((Game.FunkyTroll[]) savedInstanceState.getSerializable("trollData"));
:?
ClassNotFoundException
मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं इसी समस्या के साथ आया हूं और मैं इसे साझा करना चाहूंगा कि मैंने इसे कैसे हल किया। मिगुएल ने कहा कि कुंजी है: एनमेस सीरियल्सिबल हैं।
निम्नलिखित एनम को देखते हुए:
enum YourEnumType {
ENUM_KEY_1,
ENUM_KEY_2
}
डाल:
Bundle args = new Bundle();
args.putSerializable("arg", YourEnumType.ENUM_KEY_1);
संपूर्णता के लिए, यह एक पूर्ण उदाहरण है कि कैसे एक बंडल में डाल दिया जाए और एक एनम को वापस लाया जाए।
निम्नलिखित एनम को देखते हुए:
enum EnumType{
ENUM_VALUE_1,
ENUM_VALUE_2
}
आप एनाम को एक बंडल में रख सकते हैं:
bundle.putSerializable("enum_key", EnumType.ENUM_VALUE_1);
और एनम को वापस पाएं:
EnumType enumType = (EnumType)bundle.getSerializable("enum_key");
मैं कोटलिन का उपयोग करता हूं।
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
है putString()
। कोटलिन के साथ अगर यह पहले से ही सुव्यवस्थित है .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
एनरम-मानों के एरे को संग्रहीत करने के लिए उपयोग करना एक अच्छा समाधान है।
Bundle.putSerializable (स्ट्रिंग कुंजी, Serializable s) और bundle.getSerializable (स्ट्रिंग कुंजी) का उपयोग करें:
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)
SecondActivity:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//...
val type = (intent.extras?.get("type") as? typeEnum.Type?)
}
एक बात का ध्यान रखें - यदि आप नोटिफिकेशन में शामिल होने के bundle.putSerializable
लिए उपयोग कर रहे हैं 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();
मुझे लगता है कि एनम को इंट (सामान्य एनम के लिए) में परिवर्तित करें और फिर बंडल पर सेट करना सबसे आसान तरीका था। इस कोड को इरादे के लिए पसंद करें:
myIntent.PutExtra("Side", (int)PageType.Fornt);
फिर चेक स्टेट के लिए:
int type = Intent.GetIntExtra("Side",-1);
if(type == (int)PageType.Fornt)
{
//To Do
}
लेकिन सभी एनम प्रकार के लिए काम नहीं!
मैंने कोल्टिन एक्सटेंशन बनाया है:
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{}