J'essaie de passer mon propre objet personnalisé dans un bundle:
Bundle b = new Bundle();
STMessage message = (STMessage)a.getAdapter().getItem(position);
b.putObject("message",message);
Je reçois l'erreur:
The method putObject(String, Object) is undefined for the type Bundle
Une façon consiste à faire en sorte que votre objet personnalisé implémente l'interface Parcelable et utilise Bundle.putParcelable/Bundle.getParcelable
Classe de modèle
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 = model.title
}
Rendez votre objet personnalisé Parcelable ou Serializable puis utilisez putParcelable ou putSerializable.
Selon la complexité de votre objet, l'un ou l'autre peut être plus facile.
Étant donné que l'utilisation de Parsable
est conçue pour des performances élevées IPC transport comme mentionné dans certains commentaires, j'ai essayé d'utiliser une approche différente.
Mon approche utilise la bibliothèque GSON de google.
Exemple
public class Person{
private String name;
private int age;
// Getter and Setters omitted
}
Vous pouvez avoir une méthode dans la classe d'utilitaire qui retourne une instance Gson, c'est pour un code et une organisation propres. J'utiliserai GsonBuilder incase quelqu'un à enregistrer l'adaptateur personnalisé.
public class Utils {
private static Gson gson;
private static Gson getGsonParser() {
if(null == gson) {
GsonBuilder builder = new GsonBuilder();
gson = builder.create();
}
return gson;
}
}
Moment de vérité!
METTRE
Bundle args = new Bundle();
String personJsonString = Utils.getGsonParser().toJson(person);
args.putString(PERSON_KEY, personJsonString);
GET
Bundle args = getArguments();
String personJsonString = args.get(PERSON_KEY);
Person person= Utils.getGsonParser().fromJson(str, Person.class);
Actuellement, je ne connais pas la limitation des performances de cette approche. Mais ça marche très bien
Comme l'a déclaré Ryan. De plus, si vous ne souhaitez transmettre qu'un seul objet sur une mise à mort logicielle, envisagez d'utiliser onRetainConfigurationInstance et getLastNonConfigurationInstance pour transmettre l'objet sérialisable. L'arborescence d'objets entière doit être sérialisable. Si vous passez l'objet via une intention, pensez à refactoriser le code objet en un code Parceable plus tard, une fois l'architecture stabilisée. Enfin, envisagez d'utiliser le nom complet de la classe lors du stockage de l'objet dans le bundle, comme dans:
inPWState= (PasswordState) getIntent().getSerializableExtra("jalcomputing.confusetext.PasswordState");
J'espère que cela pourra aider. JAL