enum类型被intent所携带时需要注意的地方
? ? ? ? 一般我們?cè)贏ctivity之間傳遞對(duì)象時(shí)多用Parcelable。比如寫(xiě)一個(gè)class,在這個(gè)class上標(biāo)明implements Parcelable并實(shí)現(xiàn)接口就可以用Intent.putExtra(String, Parcelable)了。對(duì)于傳遞enum對(duì)象,假設(shè)也采用此方法,即像http://stackoverflow.com/questions/2836256/passing-enum-or-object-through-an-intent-the-best-solution里面3樓說(shuō)的:
?
[java]?view plaincopy
??????? 那么我們先定義一個(gè)MyEnum變量a,再調(diào)用intent.putExtra("name", a),會(huì)報(bào)The method putExtra(String, Parcelable) is ambiguous for the type Intent的錯(cuò),為何?
?
因?yàn)閑num自身實(shí)現(xiàn)了Serializable接口,Enum類的源代碼里這么寫(xiě)的:
?
[java]?view plaincopy
??????? 之后你的MyEnum類再實(shí)現(xiàn)Parcelable接口,而intent里面有這樣兩個(gè)函數(shù):Intent.putExtra(String, Parcelable)和Intent.putExtra(String, Serializable),你的MyEnum類實(shí)現(xiàn)了Serializable和Parcelable兩個(gè)接口,在調(diào)用Intent.putExtra時(shí),編譯器就不知道該選Intent.putExtra(String, Parcelable)還是Intent.putExtra(String, Serializable),導(dǎo)致二義性。那么上面的說(shuō)法是否真的無(wú)用?? 其實(shí)這種寫(xiě)法在MyEnum對(duì)象作為類Father1的成員時(shí)還是可以這么寫(xiě)的,我們?cè)贏ctivity間傳Father1,Father1是可以實(shí)現(xiàn)Parcelable接口的。Father1內(nèi)部處理MyEnum成員時(shí)可以這樣:
?
?
[java]?view plaincopy?
??????? 經(jīng)測(cè)試,也可以把enum傳遞出去。
??????? 既然上述MyEnum的寫(xiě)法可以適應(yīng)enum作為Parcelable類成員來(lái)傳遞,而不能作為單獨(dú)的對(duì)象來(lái)傳遞,要兼得二者該如何做?
??????? 首先,MyEnum不需實(shí)現(xiàn)Parcelable接口,單獨(dú)傳遞MyEnum對(duì)象時(shí)就用Intent.putExtra(String, Serializable)。
??????? 然后把MyEnum的createFromParcel()和writeToParcel()的代碼整合進(jìn)Father類,代碼片段(變量名有改動(dòng)):
?
[java]?view plaincopy??????? 再用Intent.putExtra(String, Parcelable)來(lái)傳Father2對(duì)象就可以了。
?
??????? 再談一下Enum類的values()方法,這個(gè)方法是無(wú)法通過(guò)eclipse查看到的,它的定義在這里,它返回所有的定義過(guò)的枚舉值,enum的底層實(shí)現(xiàn)就是定義從0到N的數(shù)個(gè)整數(shù),只不過(guò)為每個(gè)整數(shù)取了個(gè)別名,一個(gè)enum變量就是這數(shù)個(gè)整數(shù)之一,這個(gè)enum變量的ordinal()方法就是返回其在這數(shù)個(gè)整數(shù)中的位置。values()靜態(tài)方法返回一個(gè)包含這數(shù)個(gè)整數(shù)的數(shù)組。
給出示例代碼(免積分下載),在MainActivity.java三處注釋的地方,分別解注釋再運(yùn)行,就會(huì)認(rèn)識(shí)得比較清楚了。
總結(jié)
以上是生活随笔為你收集整理的enum类型被intent所携带时需要注意的地方的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 修改RHEL7/centos7网卡为et
- 下一篇: 读《不要等到毕业以后》有感①