2013-07-18 45 views
9

首先我檢查this answer如何擴展實現Parcelable接口的android類?

我想要做的是擴展Location類叫做LocationPlus,它有一些 成員變量。我試圖實現的功能是將LocationPlus類的對象從一個活動傳遞到另一個活動。

這裏試着寫構造

public LocationPlus(Parcel in) { 

有人在評論問我後LocationPlus上課的時候是我CREATOR

public static final Parcelable.Creator<LocationPlus> CREATOR = new Parcelable.Creator<LocationPlus>() { 
    @Override 
    public LocationPlus createFromParcel(Parcel source) { 
     return new LocationPlus(source); 
    } 
    @Override 
    public LocationPlus[] newArray(int size) { 
     return new LocationPlus[size]; 
    } 
}; 

問題我面臨的是此錯誤

Implicit super constructor Location() is undefined. Must explicitly invoke another constructor 

所以這裏是

public class LocationPlus extends Location{ 

    private int mBattery = -1; 

    public LocationPlus(String locationName) { 
     super(locationName); 
    } 

    public LocationPlus(Location location) { 
     super(location); 
    } 

    public int getmBattery() { 
     return mBattery; 
    } 

    public void setmBattery(int mBattery) { 
     this.mBattery = mBattery; 
    } 
    @Override 
    public int describeContents() { 
     return 0; 
    } 

    public static final Parcelable.Creator<LocationPlus> CREATOR = new Parcelable.Creator<LocationPlus>() { 
     @Override 
     public LocationPlus createFromParcel(Parcel source) { 
      return new LocationPlus(source); 
     } 
     @Override 
     public LocationPlus[] newArray(int size) { 
      return new LocationPlus[size]; 
     } 
    }; 

    @Override 
    public void writeToParcel(Parcel out, int flags) { 
     super.writeToParcel(out, flags); 
     out.writeInt(mBattery); 
    } 

    public LocationPlus(Parcel in) { 
     mBattery =in.readInt(); 
    } 
} 
+0

安置自己的LocationPlus類 –

+0

@Hasslarn代碼公佈。 – Akram

+0

只是爲了好奇,如果你在LocationPlus中放置一個空的構造函數(嘗試空和超級調用),它會說什麼:public LocationPlus(){super()}。我沒有這臺機器上的Java,所以不幸我不能嘗試它。位置構造函數可能受到保護。 –

回答

0

根據Android文檔,位置類沒有Location()構造函數。在初始化您的LocationPlus班時,您需要撥打super(String provider)super(Location l)

編輯:更正語法

(見Location Android Doc

+0

感謝您的寶貴時間和答案布賴恩我看到了我正在尋找任何解決此問題的文檔。 – Akram

+0

你需要做的是在'LocationPlus(Parcel in)'方法中包含對'super(String provider)'或'super(Location l)'構造函數的調用。 – Brian

1

嘗試這種解決方案:

public static final Parcelable.Creator<LocationPlus> CREATOR = 
    new Parcelable.Creator<LocationPlus>() { 
    @Override 
    public LocationPlus createFromParcel(Parcel in) { 

     Location l = Location.CREATOR.createFromParcel(in); 
     LocationPlus lp = new LocationPlus(l); 

     lp.mBattery= in.readInt(); 

     return lp; 
    } 

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

@Override 
public void writeToParcel(Parcel parcel, int flags) { 
    super.writeToParcel(parcel, flags); 
    parcel.writeInt(mBattery); 

} 
4

您好我已經做研究了很多關於這一點,但我找不到有用的東西。我嘗試下面的解決方案,它爲我工作。

假設你的超類只有名爲「mData」的int變量。

public class Location implements Parcelable { 
protected int mData; 

public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel out, int flags) { 
    out.writeInt(mData); 
} 

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

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

private Location(Parcel in) { 
    mData = in.readInt(); 
} 

}

然後,你的擴展類只有int變量命名爲 「mBattery」。

public class LocationPlus extends Location { 
protected int mBattery; 

public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel out, int flags) { 
    out.writeInt(mBattery); 
} 

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

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

private LocationPlus(Parcel in) { 
    mBattery = in.readInt(); 
} 

}

到目前爲止,LocationPlus工作正常。但是我們不設置超類的變量。首先,我使用super(..)方法在擴展類上設置了超類的變量。但它沒有奏效。

private LocationPlus(Parcel in) { 
    super(in); 
    mBattery = in.readInt(); 
} 

而不是上面的代碼,你應該明確地設置所有超類的變量。超級'變量應該受到保護。最終構造函數應該是這樣的:

private LocationPlus(Parcel in) { 
    mData = in.readIn(); 
    mBattery = in.readInt(); 
} 

和writeToParcel方法應該是這樣的:

public void writeToParcel(Parcel out, int flags) { 
    out.writeIn(mData); 
    out.writeInt(mBattery); 
} 
+0

在LocationPlus構造函數中執行super(in)應該可以工作,您只需確保在writeToParcel中執行super.writeToParcel(out,flags)。 – SilentByte

28

Parcelable的速度之王

根據google engineers,該代碼將運行明顯更快。其中一個原因是,我們正在明確序列化過程,而不是使用反射來推斷它。也有理由認爲代碼已經爲此目的進行了大量優化。

public abstract class BaseClass implements Parcelable { 

    public String FullName; 
    public boolean IsValidUser; 
    public String UserName; 


    public BaseClass() { 
    } 


    protected BaseClass(Parcel in) { 
     FullName = in.readString(); 
     IsValidUser = in.readByte() != 0; 
     UserName = in.readString(); 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(FullName); 
     dest.writeByte((byte) (IsValidUser ? 1 : 0)); 
     dest.writeString(UserName); 
    } 
} 

兒童類會隨着名單使用添加到parcelable對象如下:

public class DerivedClass extends BaseClass { 

    public boolean IsSuccess; 
    public String Message; 
    public List<AnotherClass> AnotherClassObj; 


    public DerivedClass() { 
     super(); 
    } 

    protected DerivedClass(Parcel in) { 
     super(in); 
     AnotherClassObj = new ArrayList<AnotherClass>(); 
     IsSuccess = in.readByte() != 0; 
     Message = in.readString(); 
     AnotherClassObj = in.readArrayList(AnotherClass.class.getClassLoader()); 
    } 

    public static final Creator<DerivedClass> CREATOR = new Creator<DerivedClass>() { 
     @Override 
     public DerivedClass createFromParcel(Parcel in) { 
      return new DerivedClass(in); 
     } 

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     super.writeToParcel(dest, flags); 
     dest.writeByte((byte) (IsSuccess ? 1 : 0)); 
     dest.writeString(Message); 
     dest.writeList(AnotherClassObj); 
    } 

    public int describeContents() { 
     return 0; 
    } 
} 

另一個孩子類:

public class AnotherClass extends BaseClass { 
    public AnotherClass() { 
     super(); 
    } 

    protected AnotherClass(Parcel in) { 
     super(in); 
    } 

    public int describeContents() { 
     return 0; 
    } 

    public static final Creator<AnotherClass> CREATOR = new Creator<AnotherClass>() { 
     @Override 
     public AnotherClass createFromParcel(Parcel in) { 
      return new AnotherClass(in); 
     } 

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     super.writeToParcel(dest, flags); 
    } 
} 

在活動

Intent intent = new Intent(LoginActivity.this, MainActivity.class); 
intent.putExtra("UserObject", parcelableObject); 
startActivity(intent); 
finish(); 

在接受活動:

Bundle extras = getIntent().getExtras(); 
if (extras != null) { 
     userObject = extras.getParcelable("UserObject"); 
}