software - android system download




एक इरादे के माध्यम से enum या वस्तु उत्तीर्ण(सबसे अच्छा समाधान) (8)

Enums का उपयोग न करें। Enums का उपयोग न करने के लिए कारण # 78। :) पूर्णांक का उपयोग करें, जिसे आसानी से बंडल और पार्ससेल के माध्यम से हटाया जा सकता है।

मेरे पास एक गतिविधि है जिसे शुरू करने के लिए दो अलग-अलग ArrayLists तक पहुंच की आवश्यकता होती है। दोनों सूचियां अलग-अलग ऑब्जेक्ट्स हैं जिन्हें मैंने स्वयं बनाया है।

असल में मुझे इन उद्देश्यों को एक इरादे से गतिविधि में पारित करने का एक तरीका चाहिए। मैं addExtras () का उपयोग कर सकता हूं लेकिन इसके लिए एक पारगम्य संगत वर्ग की आवश्यकता है। मैं अपने वर्गों को धारावाहिक पारित करने के लिए बना सकता हूं लेकिन जैसा कि मैं समझता हूं कि यह प्रोग्राम धीमा कर देता है।

मेरे विकल्प क्या हैं?

क्या मैं एक एनम पास कर सकता हूं?

एक तरफ के रूप में: क्या एक उद्देश्य से एक गतिविधि निर्माता को पैरामीटर पास करने का कोई तरीका है?


अपने एनम को सीरियलज़ेबल लागू करना संभव हो सकता है, तो आप इसे इरादे के माध्यम से पारित कर सकते हैं, क्योंकि इसे धारावाहिक के रूप में पास करने के लिए एक विधि है। Enum के बजाय int का उपयोग करने की सलाह फर्जी है। एनम्स का उपयोग आपके कोड को पढ़ने और बनाए रखने में आसान बनाने के लिए किया जाता है। यह एम्स का उपयोग करने में सक्षम नहीं होने के लिए अंधेरे युग में पीछे एक बड़ा कदम होगा।


आप अपने enum पार्सलबल लागू कर सकते हैं जो enums के लिए काफी आसान है:

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.putExtra (स्ट्रिंग, पार्सेलबल) का उपयोग कर सकते हैं।

अद्यतन: कृपया wreckgar की टिप्पणी नोट करें कि enum.values() प्रत्येक कॉल पर एक नई सरणी आवंटित करता है।


आप एक स्ट्रिंग के रूप में एक enum पारित कर सकते हैं।

public enum CountType {
    ONE,
    TWO,
    THREE
}

private CountType count;
count = ONE;

String countString = count.name();

CountType countToo = CountType.valueOf(countString);

दिए गए तारों का समर्थन किया जाता है, आप बिना किसी समस्या के enum के मूल्य को पारित करने में सक्षम होना चाहिए।


ओडेरिक की पोस्ट के बारे में:

आप अपने enum पार्सलबल लागू कर सकते हैं जो enums के लिए काफी आसान है:

सार्वजनिक enum MyEnum पार्ससेलबल लागू करता है {...} आप Intent.putExtra (स्ट्रिंग, पार्ससेल योग्य) का उपयोग करने से भी कर सकते हैं।

यदि आप MyEnum वैरिएबल myEnum को परिभाषित करते हैं, तो intent.putExtra ("पार्ससेलबल 1", myEnum) करें, आपको "एटेंट टाइप स्ट्रक्चर (स्ट्रिंग, पार्ससेलबल) टाइप इंटेंट" त्रुटि संदेश के लिए संदिग्ध है। क्योंकि एक इरादा.पुट एक्स्ट्रा (स्ट्रिंग, पार्ससेलबल) विधि भी है, और मूल 'एनम' प्रकार स्वयं ही सीरियलज़ेबल इंटरफ़ेस लागू करता है, इसलिए संकलक को यह नहीं पता कि कौन सी विधि (intent.putExtra (स्ट्रिंग, पार्सेलबल / या सीरियलज़ेबल)) चुनें।

सुझाव दें कि MyEnum से पार्ससेल इंटरफ़ेस को हटा दें, और कोर कोड को रैप क्लास 'पार्ससेल योग्य कार्यान्वयन में ले जाएं, इस तरह (पिता 2 एक पार्ससेल योग्य है और इसमें एक एनम फ़ील्ड है):

public class Father2 implements Parcelable {

AnotherEnum mAnotherEnum;
int mField;

public Father2(AnotherEnum myEnum, int field) {
    mAnotherEnum = myEnum;
    mField = field;
}

private Father2(Parcel in) {
    mField = in.readInt();
    mAnotherEnum = AnotherEnum.values()[in.readInt()];
}

public static final Parcelable.Creator<Father2> CREATOR = new Parcelable.Creator<Father2>() {

    public Father2 createFromParcel(Parcel in) {
        return new Father2(in);
    }

    @Override
    public Father2[] newArray(int size) {
        return new Father2[size];
    }

};

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(mField);
    dest.writeInt(mAnotherEnum.ordinal());
}

}

तो हम कर सकते हैं:

AnotherEnum anotherEnum = AnotherEnum.Z;
intent.putExtra("Serializable2", AnotherEnum.X);   
intent.putExtra("Parcelable2", new Father2(AnotherEnum.X, 7));

निम्नलिखित enum पर विचार करें ::

public static  enum MyEnum {
    ValueA,
    ValueB
}

पासिंग के लिए ::

 Intent mainIntent = new Intent(this,MyActivity.class);
 mainIntent.putExtra("ENUM_CONST", MyEnum.ValueA);
 this.startActivity(mainIntent);

इरादे / बंडल / तर्क से वापस पुनर्प्राप्त करने के लिए ::

 MyEnum myEnum = (MyEnum) intent.getSerializableExtra("ENUM_CONST");

मुझे सरल पसंद है।

  • फ्रेड गतिविधि में दो तरीके हैं - HAPPY और SAD
  • एक स्थिर IntentFactory बनाएं जो आपके लिए अपना Intent बनाता है। इसे इच्छित Mode पास करें।
  • IntentFactory अतिरिक्त वर्ग के नाम के रूप में Mode क्लास के नाम का उपयोग करता है।
  • IntentFactory Mode का उपयोग कर Mode को String परिवर्तित करता है name()
  • onCreate में प्रवेश करने पर इस जानकारी का उपयोग वापस Mode कनवर्ट करने के लिए करें।
  • आप ordinal() और Mode.values() का भी उपयोग कर सकते हैं। मुझे तार पसंद है क्योंकि मैं उन्हें डीबगर में देख सकता हूं।

    public class Fred extends Activity {
    
        public static enum Mode {
            HAPPY,
            SAD,
            ;
        }
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.betting);
            Intent intent = getIntent();
            Mode mode = Mode.valueOf(getIntent().getStringExtra(Mode.class.getName()));
            Toast.makeText(this, "mode="+mode.toString(), Toast.LENGTH_LONG).show();
        }
    
        public static Intent IntentFactory(Context context, Mode mode){
            Intent intent = new Intent();
            intent.setClass(context,Fred.class);
            intent.putExtra(Mode.class.getName(),mode.name());
    
            return intent;
        }
    }
    

यदि आपको वास्तव में आवश्यकता है, तो आप name() और valueOf(String) का उपयोग करके एक enum को स्ट्रिंग के रूप में क्रमबद्ध कर सकते हैं, निम्नानुसार:

 class Example implements Parcelable { 
   public enum Foo { BAR, BAZ }

   public Foo fooValue;

   public void writeToParcel(Parcel dest, int flags) {
      parcel.writeString(fooValue == null ? null : fooValue.name());
   }

   public static final Creator<Example> CREATOR = new Creator<Example>() {
     public Example createFromParcel(Parcel source) {        
       Example e = new Example();
       String s = source.readString(); 
       if (s != null) e.fooValue = Foo.valueOf(s);
       return e;
     }
   }
 }

यह स्पष्ट रूप से काम नहीं करता है अगर आपके enums में परिवर्तनीय स्थिति है (जो उन्हें वास्तव में नहीं करना चाहिए)।





android