How to pass custom object in Bundle?
One way is to have your custom object implement the Parcelable interface and use Bundle.putParcelable/Bundle.getParcelable
Model Class
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; }}
MainActivity
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. In Kotlin is the same 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()); }}
// Kotlin
val model: ProgramModel? = intent.getSerializableExtra("Editing") as ProgramModel? model?.let { // means if not null or empty txt_act_daily_topic.text = it.title }
Since using Parsable
is designed for high performance IPC transport as mentioned in some of the comments, I tried using a different approach.
My approach uses GSON library by google.
Example
public class Person{ private String name; private int age; // Getter and Setters omitted}
You can have a method in utility class that returns Gson instance, this is for the sake of clean code and organisation. I will use GsonBuilder incase someone what to register custom adapter.
public class Utils { private static Gson gson; private static Gson getGsonParser() { if(null == gson) { GsonBuilder builder = new GsonBuilder(); gson = builder.create(); } return gson; }}
Moment of truth!
PUT
Bundle args = new Bundle();String personJsonString = Utils.getGsonParser().toJson(person);args.putString(PERSON_KEY, personJsonString);
GET
Bundle args = getArguments();String personJsonString = args.getString(PERSON_KEY);Person person= Utils.getGsonParser().fromJson(personJsonString, Person.class);
Currently I don't know the performance limitation of this approach. But it works just fine