web-dev-qa-db-fra.com

Passer des données via intentionnel à l'aide de Serializable

J'ai implémenté ma classe avec serializable, mais cela n'a toujours pas fonctionné.

Ceci est ma classe:

package com.ursabyte.thumbnail;

import Java.io.Serializable;

import Android.graphics.Bitmap;

public class Thumbnail implements Serializable {

    private static final long serialVersionUID = 1L;
    private String label = "";
    private Bitmap bitmap;

    public Thumbnail(String label, Bitmap bitmap) {
        this.label = label;
        this.bitmap = bitmap;
    }

    public void set_label(String label) {
        this.label = label;
    }

    public String get_label() {
        return this.label;
    }

    public void set_bitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }

    public Bitmap get_bitmap(){
        return this.bitmap;
    }

    //  @Override
    //  public int compareTo(Thumbnail other) {
    //      if(this.label != null)
    //          return this.label.compareTo(other.get_label());
    //      else
    //          throw new IllegalArgumentException();
    //  }

}

C'est ce que je veux faire passer.

List<Thumbnail> all_thumbs = new ArrayList<Thumbnail>();
all_thumbs.add(new Thumbnail(string, bitmap));
Intent intent = new Intent(getApplicationContext(), SomeClass.class);
intent.putExtra("value", all_thumbs);

Mais ça n'a toujours pas marché. Je ne sais pas comment utiliser Parcelable, je l'utilise donc à la place.

63
Bias Tegaralaga

Essayez de transmettre la liste sérialisable en utilisant Bundle.Serializable :

Bundle bundle = new Bundle();
bundle.putSerializable("value", all_thumbs);
intent.putExtras(bundle);

Et dans SomeClass Activity, obtenez-le en tant que:

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();

List<Thumbnail> thumbs=
               (List<Thumbnail>)bundle.getSerializable("value");
144
ρяσѕρєя K

Ce code peut vous aider:

public class EN implements Serializable {
//... you don't need implement any methods when you implements Serializable
}

Mettre des données. Créer une nouvelle activité avec un extra:

EN enumb = new EN();
Intent intent = new Intent(getActivity(), NewActivity.class);
intent.putExtra("en", enumb); //second param is Serializable
startActivity(intent);

Obtention de données de la nouvelle activité:

public class NewActivity extends Activity {

    private EN en;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);

            Bundle extras = getIntent().getExtras();
            if (extras != null) {
                en = (EN)getIntent().getSerializableExtra("en"); //Obtaining data 
            }
//...
12
Yuliia Ashomok

J'ai étendu la réponse de ρяσѕρєя K pour rendre le code complet et exploitable. Ainsi, lorsque vous avez fini de remplir votre liste "all_thumbs", vous devez en insérer le contenu un par un dans la liasse, puis dans l'intention:

Bundle bundle = new Bundle();

for (int i = 0; i<all_thumbs.size(); i++)
bundle.putSerializable("extras"+i, all_thumbs.get(i));

intent.putExtras(bundle);

Pour obtenir les extras de l'intention, il vous faut:

Bundle bundle = new Bundle();
List<Thumbnail> thumbnailObjects = new ArrayList<Thumbnail>();

// collect your Thumbnail objects
for (String key : bundle.keySet()) {
thumbnailObjects.add((Thumbnail) bundle.getSerializable(key));
}

// for example, in order to get a value of the 3-rd object you need to:
String label = thumbnailObjects.get(2).get_label();

L'avantage de Serializable est sa simplicité. Cependant, je vous recommanderais d’envisager l’utilisation de la méthode Parcelable lorsque vous devez transférer de nombreuses données, car Parcelable est spécialement conçu pour Android et est plus efficace que Serializable. Vous pouvez créer la classe Parcelable en utilisant:

  1. un outil en ligne - parcelabler
  2. un plugin pour Android Studion - générateur de code Android Parcelable)
6
Ayaz Alifov

Envoi de données:

Créez d'abord vos données sérialisables en implémentant Serializable dans votre classe de données

public class YourDataClass implements Serializable {
String someText="Some text";
}

Puis le mettre dans l'intention

YourDataClass yourDataClass=new YourDataClass();
Intent intent = new Intent(getApplicationContext(),ReceivingActivity.class);
intent.putExtra("value",yourDataClass);
startActivity(intent);

Réception de données:

YourDataClass yourDataClass=(YourDataClass)getIntent().getSerializableExtra("value");
5
Anisuzzaman Babla
Intent intent = new Intent(getApplicationContext(),SomeClass.class);
intent.putExtra("value",all_thumbs);
startActivity(intent);

Dans SomeClass.Java

Bundle b = getIntent().getExtras();
if(b != null)
thumbs = (List<Thumbnail>) b.getSerializable("value");
3
Aditya Kushwaha

Vous devez créer un Bundle puis utiliser putSerializable :

List<Thumbnail> all_thumbs = new ArrayList<Thumbnail>();
all_thumbs.add(new Thumbnail(string,bitmap));
Intent intent = new Intent(getApplicationContext(),SomeClass.class);

Bundle extras = new Bundle();

extras.putSerializable("value",all_thumbs);
intent.putExtras(extras);
2
EvZ

Créez votre objet personnalisé et implémentez Serializable. Ensuite, vous pouvez utiliser intent.putExtra("package.name.example", <your-serializable-object>).

Dans la deuxième activité, vous le lisez en utilisant getIntent().getSerializableExtra("package.name.example")

Sinon, suivez this et this page.

1
Janmejoy

Dans kotlin: La classe d'objet implémente Serializable:

class MyClass: Serializable {
//members
}

Au point où l'objet envoyant:

val fragment = UserDetailFragment()
val bundle = Bundle()
bundle.putSerializable("key", myObject)
fragment.arguments = bundle

Au fragment, où nous voulons obtenir notre objet:

val bundle: Bundle? = arguments
    bundle?.let {
        val myObject = it.getSerializable("key") as MyClass
        myObject.memberName?.let { it1 -> showShortToast(it1) }
    }
1
vishnu benny