Android-实现内部可包裹类 [英] Android - Implementing Parcelable Inner Class

查看:89
本文介绍了Android-实现内部可包裹类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道如何使用公共变量实现一个简单的Parcelable类,但是下面的类要复杂一些.在此类具有内部类和ListEntity的情况下,如何实现Parcelable接口?我什至不知道如何开始.任何有关如何执行此操作的详细信息将不胜感激.

import android.os.Parcel;
import android.os.Parcelable;

import java.util.List;

public class ResponsePlaceSearch implements Parcelable {

    // *** Parcelable methods are shown below (Begin) ***

    protected ResponsePlaceSearch(Parcel in) {
    }

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

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

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {

    }

    // *** (End) ***


    private List<ListEntity> list;

    public void setList(List<ListEntity> list) {
        this.list = list;
    }

    public List<ListEntity> getList() {
        return list;
    }

    public static class ListEntity {
        private int id;
        private String name;

        private CoordEntity coord;
        private int dt;

        private WindEntity wind;

        private SysEntity sys;

        public void setId(int id) {
            this.id = id;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setCoord(CoordEntity coord) {
            this.coord = coord;
        }

        public void setDt(int dt) {
            this.dt = dt;
        }

        public void setWind(WindEntity wind) {
            this.wind = wind;
        }

        public void setSys(SysEntity sys) {
            this.sys = sys;
        }

        public int getId() {
            return id;
        }

        public String getName() {
            return name;
        }

        public CoordEntity getCoord() {
            return coord;
        }

        public int getDt() {
            return dt;
        }

        public WindEntity getWind() {
            return wind;
        }

        public SysEntity getSys() {
            return sys;
        }

        public static class CoordEntity {
            private double lon;
            private double lat;

            public void setLon(double lon) {
                this.lon = lon;
            }

            public void setLat(double lat) {
                this.lat = lat;
            }

            public double getLon() {
                return lon;
            }

            public double getLat() {
                return lat;
            }
        }

        public static class WindEntity {
            private double speed;
            private double deg;

            public void setSpeed(double speed) {
                this.speed = speed;
            }

            public void setDeg(double deg) {
                this.deg = deg;
            }

            public double getSpeed() {
                return speed;
            }

            public double getDeg() {
                return deg;
            }
        }

        public static class SysEntity {
            private String country;

            public void setCountry(String country) {
                this.country = country;
            }

            public String getCountry() {
                return country;
            }
        }
    }
}

解决方案

您只需要为每个内部类(ListEntity,SysEntity等)实现Parcelable接口,因此所有包含它们的类和它们的类都实现了Parcelable. /p>

然后使用

将类添加到包裹中

public final void writeParcelable (Parcelable p, int parcelableFlags)

其中p是内部类的实例.

这是一个如何包裹内部类的例子:

public class SampleParcelable implements Parcelable {
    public static class InnerClass implements Parcelable {
        private String mInnerString;
        private long mInnerLong;

        // parcelable interface
        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(mInnerString);
            dest.writeLong(mInnerLong);
        }

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

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

        private InnerClass(Parcel in) {
            mInnerString = in.readString();
            mInnerLong = in.readLong();
        }
    }

    private String mString;
    private long mLong;
    private InnerClass mInnerClass;

    // parcelable interface
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mString);
        dest.writeLong(mLong);
        dest.writeParcelable(mInnerClass, flags);
    }

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

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

    private SampleParcelable(Parcel in) {
        mString = in.readString();
        mLong = in.readLong();
        mInnerClass = in.readParcelable(InnerClass.class.getClassLoader());
    }
}

I know how to implement a simple Parcelable class with public variables but the class below is somewhat more complex. How can I implement the Parcelable interface given that this class has an inner class and ListEntity? I'm not even sure how to begin. Any detailed information on how to do this would be greatly appreciated.

import android.os.Parcel;
import android.os.Parcelable;

import java.util.List;

public class ResponsePlaceSearch implements Parcelable {

    // *** Parcelable methods are shown below (Begin) ***

    protected ResponsePlaceSearch(Parcel in) {
    }

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

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

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {

    }

    // *** (End) ***


    private List<ListEntity> list;

    public void setList(List<ListEntity> list) {
        this.list = list;
    }

    public List<ListEntity> getList() {
        return list;
    }

    public static class ListEntity {
        private int id;
        private String name;

        private CoordEntity coord;
        private int dt;

        private WindEntity wind;

        private SysEntity sys;

        public void setId(int id) {
            this.id = id;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setCoord(CoordEntity coord) {
            this.coord = coord;
        }

        public void setDt(int dt) {
            this.dt = dt;
        }

        public void setWind(WindEntity wind) {
            this.wind = wind;
        }

        public void setSys(SysEntity sys) {
            this.sys = sys;
        }

        public int getId() {
            return id;
        }

        public String getName() {
            return name;
        }

        public CoordEntity getCoord() {
            return coord;
        }

        public int getDt() {
            return dt;
        }

        public WindEntity getWind() {
            return wind;
        }

        public SysEntity getSys() {
            return sys;
        }

        public static class CoordEntity {
            private double lon;
            private double lat;

            public void setLon(double lon) {
                this.lon = lon;
            }

            public void setLat(double lat) {
                this.lat = lat;
            }

            public double getLon() {
                return lon;
            }

            public double getLat() {
                return lat;
            }
        }

        public static class WindEntity {
            private double speed;
            private double deg;

            public void setSpeed(double speed) {
                this.speed = speed;
            }

            public void setDeg(double deg) {
                this.deg = deg;
            }

            public double getSpeed() {
                return speed;
            }

            public double getDeg() {
                return deg;
            }
        }

        public static class SysEntity {
            private String country;

            public void setCountry(String country) {
                this.country = country;
            }

            public String getCountry() {
                return country;
            }
        }
    }
}

解决方案

You simply need to implement the Parcelable interface for each inner class (ListEntity, SysEntity, ...), so all classes and classes they contain implement Parcelable.

Then you add the class to the parcel using

public final void writeParcelable (Parcelable p, int parcelableFlags)

where p is the instance of your inner class.

Edit: here's an example of how to parcel an inner class:

public class SampleParcelable implements Parcelable {
    public static class InnerClass implements Parcelable {
        private String mInnerString;
        private long mInnerLong;

        // parcelable interface
        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(mInnerString);
            dest.writeLong(mInnerLong);
        }

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

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

        private InnerClass(Parcel in) {
            mInnerString = in.readString();
            mInnerLong = in.readLong();
        }
    }

    private String mString;
    private long mLong;
    private InnerClass mInnerClass;

    // parcelable interface
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mString);
        dest.writeLong(mLong);
        dest.writeParcelable(mInnerClass, flags);
    }

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

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

    private SampleParcelable(Parcel in) {
        mString = in.readString();
        mLong = in.readLong();
        mInnerClass = in.readParcelable(InnerClass.class.getClassLoader());
    }
}

这篇关于Android-实现内部可包裹类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆