Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有地图属性的可包裹嵌套类应用程序_Java_Android_Android Intent_Parcelable - Fatal编程技术网

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);