2013-04-05 77 views
2

我有一个CustomAddress类,它扩展了android.location.Address类,该类实现Parcelable扩展Android可分类类

我想让我的CustomAddress实现Parcelable,但是在从包裹创建我的课程时卡住了。从包裹创建CustomAddress时,我想首先填写超类Address的所有字段,然后填写自己的字段。所以,我已经实现了CREATOR领域:

public static final Parcelable.Creator<CustomAddress> CREATOR 
= new Parcelable.Creator<CustomAddress>() { 
    public CustomAddress createFromParcel(Parcel in) { 
     return new CustomAddress(in); 
    } 

    public CustomAddress[] newArray(int size) { 
     return new CustomAddress[size]; 
    } 
}; 

但在我CustomAddress(Parcel in)创作者,我不能叫super(in),因为它不存在android.location.Address。我只能访问android.location.Address.CREATOR。那么如何使用CREATOR填写我的领域?

编辑:链接到Android Addresshttps://developer.android.com/reference/android/location/Address.html

回答

0

这里有一个类似的问题和马克·墨菲的出色答卷:https://stackoverflow.com/a/10841502/1140682

所以,你的情况,你会作出CustomAddress延长Address(因为你已经做),请在构造函数中调用super()方法,然后从传递的Parcel中读取您自己的属性。在writeToParcel()方法中必须完成(以相同的顺序),当然这里将属性添加到包裹中。

+0

谢谢我检查了这个答案,但我认为我的情况是不同的。如果我只是打电话给super(),现在关于包裹的超类怎么样?我希望所有的超类字段都被填充。 – chopchop 2013-04-05 01:47:20

+0

对不起,现在我明白了'Address'类是不同的,因为它不会从构造函数参数中获取它的包,而是使用创建者。在这种情况下,除了调整'Address.CREATOR'' ['createFromParcel()']'的代码外(https://github.com/android/platform_frameworks_base/blob/master/location/java/android/) location/Address.java#L477)或者使用组合而不是继承(即让你的'CustomAddress'管理一个'Address'而不是继承它的子类)。我知道这两种方法都不是最佳实践。 – saschoar 2013-04-05 10:49:38

+0

嗯好吧,这是相当恼人的行为... – chopchop 2013-04-07 23:21:09