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