web-dev-qa-db-fra.com

Comment passer un objet personnalisé en Bundle?

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
29
Sheehan Alam

Une façon consiste à faire en sorte que votre objet personnalisé implémente l'interface Parcelable et utilise Bundle.putParcelable/Bundle.getParcelable

43
Ryan Reeves

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
        }
14
Sam

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.

9
Squonk

É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

6
Emmanuel Mtali

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

0
JAL