【问题标题】:Is it possible put a custom class into Bundle?是否可以将自定义类放入 Bundle 中?
【发布时间】:2019-05-17 21:35:19
【问题描述】:

在我的 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 );

【问题讨论】:

  • “所以我想使用 Bundle 传递这个类”——如果这个对象代表全局设置,也许你不应该传递它,而是有一个你使用的单例实例。 “我尝试使用 Parcelable 但它不起作用?” -- 你没有在你的Setting 类上实现Parcelable

标签: android class android-intent bundle


【解决方案1】:

你必须实现 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中:

bundle.putParcelable("tag_here", setting);

【讨论】:

  • 这是我真正想要的。谢谢。
【解决方案2】:

您可以使用gson 库将整个设置对象转换为 json 字符串,方法是将其传递给当前活动的意图,然后在接收活动时将其恢复为设置对象。

当前活动:

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

注意:将json字符串传递给intent。

接收活动: 注意:从intent接收json字符串。

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

【讨论】:

    【解决方案3】:

    你必须实现 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);
       }
    }
    

    【讨论】:

      【解决方案4】:
      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`"); 
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-25
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 2017-12-17
        • 2022-11-03
        相关资源
        最近更新 更多