Java 具有地图属性的可包裹嵌套类应用程序
我有两个包裹:Java 具有地图属性的可包裹嵌套类应用程序,java,android,android-intent,parcelable,Java,Android,Android Intent,Parcelable,我有两个包裹: class MyDevice implements Parcelable{ @SerializedName("DeviceName") public String DeviceName; @SerializedName("StolenFlag") public Boolean StolenFlag; @SerializedName("BatteryLevel") publi
class MyDevice implements Parcelable{
@SerializedName("DeviceName")
public String DeviceName;
@SerializedName("StolenFlag")
public Boolean StolenFlag;
@SerializedName("BatteryLevel")
public int BatteryLevel;
@SerializedName("LastLocalization")
public Map<String,Geography> LastLocalization;
protected MyDevice(Parcel in) {
DeviceName = in.readString();
BatteryLevel = in.readInt();
StolenFlag = in.readByte() !=0;
LastLocalization = in.readParcelable(Geography.class.getClassLoader());
}
....
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(DeviceName);
dest.writeByte((byte) (StolenFlag ? 1 : 0));
dest.writeInt(BatteryLevel);
dest.writeParcelable(LastLocalization.get("Geography"), 0);
}
}
把它付诸行动是好的。当我试图从意图中得到它时:
Intent intent = getIntent();
ArrayList<MyDevice> MyDevicesList = intent.getParcelableArrayListExtra("data");
Intent-Intent=getIntent();
ArrayList MyDeviceList=intent.getParcelableArrayListExtra(“数据”);
我的应用程序崩溃并出现错误:java.lang.RuntimeException:无法启动活动组件信息{com.example.andrev.lab3/com.example.andrev.lab3.SecondActivity}:java.lang.ClassCastException:com.example.andrev.lab3.Geography无法转换为java.util.Map
我想我应该修改我的设备或受地理保护的构造函数,但我不知道如何修改。有人能帮我吗?谢谢您的时间。您正在编写一个
地理实例:
dest.writeParcelable(LastLocalization.get("Geography"), 0);
您正试图读取地图
:
这不是一回事
如果您希望还原的MyDevice
包含完整的LastLocalization
映射,您应该具有:
dest.writeParcelable(LastLocalization, 0);
您的问题是这一行:
LastLocalization = in.readParcelable(Geography.class.getClassLoader());
您正在读取一个类型为Geography
的包裹,并试图将其分配给类型为Map
的字段
您应该将其修改为以下内容:
Geography geography = in.readParcelable(Georgraphy.class.getClassLoader());
LastLocalization = new HashMap<>();
LastLocalization.put("Geography", geography);
Geography=in.readParcelable(georography.class.getClassLoader());
LastLocalization=newHashMap();
LastLocalization.put(“地理”,地理);
它基本上是从writeToParcel()
反转您的操作,请注意,在MyDevice属性中,LastLocalization是公共地图LastLocalization代码>,当我试图将此dest.writeParcelable(LastLocalization,0)放入时代码>我收到一个错误,说它找到了Map,并且required是可打包的。@莱克:好的,那么您可能需要迭代所有条目并写出它们,然后以这种方式还原它们。不管怎样,你写的和读的都必须匹配,而你现在拥有的并不匹配。谢谢你的帮助,我知道了。问题是,我真的必须像android studio希望我做的那样实现所有映射方法吗?我不能只创建LastLocalization=newmap()代码>,因为它调用我来实现重写的方法。@laik My bad。您应该提供Map
接口的具体实现,如HashMap
。我将编辑我的答案。我在代码中犯了一个错误,但你的解决方案有效!你就是那个人,非常感谢!
LastLocalization = in.readParcelable(Geography.class.getClassLoader());
Geography geography = in.readParcelable(Georgraphy.class.getClassLoader());
LastLocalization = new HashMap<>();
LastLocalization.put("Geography", geography);