Можно ли поместить пользовательский класс в Bundle? - PullRequest
0 голосов
/ 18 мая 2019

В моем проекте Android я определяю класс как «Настройки», который включает в себя глобальные значения настроек, и я буду использовать его во многих различных действиях.Итак, я хочу передать этот класс с помощью Bundle, и я попытался использовать Parcelable, но он не работает?Можете ли вы рассказать, что такое лучшая практика?

Это мой класс:

public class Setting{
        String set1;
        boolean set2;
        int set3;
    }

И вот как я пытался связать намерения с другим заданием:

...
Setting sets = new Setting();
sets.set1 = "test";
sets.set2 = true;
sets.set3 = 1;
...
Bundle b = new Bundle();
b.putParcelable("pass_settings", (Parcelable) sets );

Ответы [ 4 ]

3 голосов
/ 18 мая 2019

Вы должны реализовать интерфейс Parcelable:

public class Setting implements Parcelable {
    String set1;
    boolean set2;
    int set3;

    protected Setting(Parcel in) {
        set1 = in.readString();
        set2 = in.readByte() != 0;
        set3 = in.readInt();
    }

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

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

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(set1);
        dest.writeByte((byte) (set2 ? 1 : 0));
        dest.writeInt(set3);
    }
}

тогда вы можете положить его в комплект:

bundle.putParcelable("tag_here", setting);
0 голосов
/ 18 мая 2019
public class Settings implements Parcelable {
    private String mSet1;
    private boolean mSet2;
    private int mSet3;

    public Settings(){}

    protected Settings(Parcel in) {
        mSet1 = in.readString();
        mSet2 = in.readByte() != 0;
        mSet3 = in.readInt();
    }

    public String getSet1() {
        return mSet1;
    }

    public void setSet1(final String set1) {
        mSet1 = set1;
    }

    public boolean isSet2() {
        return mSet2;
    }

    public void setSet2(final boolean set2) {
        mSet2 = set2;
    }

    public int getSet3() {
        return mSet3;
    }

    public void setSet3(final int set3) {
        mSet3 = set3;
    }

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

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

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

    @Override
    public void writeToParcel(final Parcel dest, final int flags) {
        dest.writeString(mSet1);
        dest.writeByte((byte) (mSet2 ? 1 : 0));
        dest.writeInt(mSet3);
    }

    private void test(){
        Settings toSave = new Settings();
        Bundle bundle = new Bundle();
        bundle.putParcelable("bundle_key", toSave);

        Settings settings = bundle.getParcelable("bundle_key`enter code here`"); 
    }
}
0 голосов
/ 18 мая 2019

Вы должны реализовать Paracable

public class Settings implements Paracable{

    String set1;
    boolean set2;
    int set3;

   // Parcelling part

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

        @Override
    public Setting[] newArray(int size) {
        return new Setting[size];
    }
};
   public Settings (Parcel in){
       this.set1= in.readLong();
       this.set2 = in.readString();
       this.set3 =  in.readString();
   }

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

   @Override
   public void writeToParcel(Parcel dest, int flags) {
      dest.writeString(this.set1);
      dest.writeBoolean(this.set2);
      dest.writeInt(this.set3);
   }
}
0 голосов
/ 18 мая 2019

Вы можете использовать библиотеку gson , чтобы преобразовать весь объект настройки в строку json, передав его намерению из текущего действия, а затем восстановить его до объекта установки при получении действия.

Текущая активность:

 1. Gson gson = new Gson();
 2. String json = gson.toJson(sets);

Примечание. Передать строку json в намерение.

Получение деятельности: Примечание. Получите строку json из намерения.

 1. Gson gson = new Gson();
 2. Setting sets = gson.fromJson(json, Setting.class);
...