如何在Bundle中传递自定义对象?

我试图将我自己的自定义对象传递给一个

Bundle b = new Bundle(); STMessage message = (STMessage)a.getAdapter().getItem(position); b.putObject("message",message); 

我得到的错误:

 The method putObject(String, Object) is undefined for the type Bundle 

Solutions Collecting From Web of "如何在Bundle中传递自定义对象?"

一种方法是让自定义对象实现Parcelable接口并使用Bundle.putParcelable/Bundle.getParcelable

让你的自定义对象Parcelable或Serializable,然后使用putParcelable或putSerializable。

根据您的对象的复杂性,一个或另一个可能会更容易。

模型类

 package com.sam.bundleobjectpass; import java.io.Serializable; /** * Created by Samir on 31.8.2016. */ public class Model implements Serializable { private String name; private String surName; private int age; public Model(String name, String surName, int age) { this.name = name; this.surName = surName; this.age = age; } public String getName() { return name; } public String getSurName() { return surName; } public int getAge() { return age; } } 

主要活动

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Model model = new Model("Sam", "Sami",32); Intent i = new Intent(MainActivity.this, ReceiverActivity.class); i.putExtra("Editing", model); // sending our object startActivity(i); } } 

ReceiverActivity

 public class ReceiverActivity extends Activity { TextView txt_name; TextView txt_surname; TextView txt_age; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); txt_name = (TextView)findViewById(R.id.txt_name); txt_surname = (TextView)findViewById(R.id.txt_surname); txt_age = (TextView)findViewById(R.id.txt_age); // receiving our object Model model = (Model) getIntent().getSerializableExtra("Editing"); txt_name.setText(model.getName()); txt_surname.setText(model.getSurName()); txt_age.setText(""+model.getAge()); } } 

由于使用Parsable是为高性能IPC传输而devise的,因此我尝试了一些不同的方法。

我的方法使用谷歌GSON库。

 public class Person{ private String name; private int age; // Getter and Setters omitted } 

你可以在工具类中有一个返回Gson实例的方法,这是为了干净的代码和组织。 我将使用GsonBuilder启动某人注册自定义适配器。

 public class Utils { private static Gson gson; private static Gson getGsonParser() { if(null == gson) { GsonBuilder builder = new GsonBuilder(); gson = builder.create(); } return gson; } } 

真相的时刻!

 Bundle args = new Bundle(); String personJsonString = Utils.getGsonParser().toJson(person); args.putString(PERSON_KEY, personJsonString); 

得到

 Bundle args = getArguments(); String personJsonString = args.get(PERSON_KEY); Person person= Utils.getGsonParser().fromJson(str, Person.class); 

目前我不知道这种方法的性能限制。 但它工作得很好

正如瑞安所言。 另外,如果你只想传递一个软件上的一个对象,可以考虑使用onRetainConfigurationInstance和getLastNonConfigurationInstance来传递可序列化的对象。 整个对象树必须是可序列化的。 如果您通过intent传递对象,则稍后在构架稳定后,考虑将对象代码重构为Parceable代码。 最后,在将对象存储到Bundle中时,请考虑使用该类的完全限定名称,如下所示:

 inPWState= (PasswordState) getIntent().getSerializableExtra("jalcomputing.confusetext.PasswordState"); 

希望有所帮助。 JAL