Frage Wie sende ich ein Objekt mit Intents von einer Android-Aktivität an eine andere?


Wie kann ich ein Objekt eines benutzerdefinierten Typs von einem übergeben? Aktivität zu einem anderen mit dem putExtra() Methode der Klasse Absicht?


743


Ursprung


Antworten:


Wenn du nur Objekte herumfährst Parcelable wurde dafür konzipiert. Es erfordert ein wenig mehr Aufwand als die native Serialisierung von Java zu verwenden, aber es ist viel schneller (und meine Weise, WEG schneller).

Ein einfaches Beispiel für die Implementierung ist in der Dokumentation:

// simple class that just has one member property as an example
public class MyParcelable implements Parcelable {
    private int mData;

    /* everything below here is for implementing Parcelable */

    // 99.9% of the time you can just ignore this
    @Override
    public int describeContents() {
        return 0;
    }

    // write your object's data to the passed-in Parcel
    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(mData);
    }

    // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
        public MyParcelable createFromParcel(Parcel in) {
            return new MyParcelable(in);
        }

        public MyParcelable[] newArray(int size) {
            return new MyParcelable[size];
        }
    };

    // example constructor that takes a Parcel and gives you an object populated with it's values
    private MyParcelable(Parcel in) {
        mData = in.readInt();
    }
}

Beachten Sie, dass Sie in dem Fall, in dem Sie mehr als ein Feld aus einem bestimmten Paket abrufen müssen, dies in derselben Reihenfolge tun müssen, in der Sie sie eingefügt haben (dh in einem FIFO-Ansatz).

Sobald Sie Ihre Objekte implementieren Parcelable es geht nur darum, sie in dich zu legen Absichten mit putExtra ():

Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);

Dann kannst du sie wieder rausziehen getParcelableExtra ():

Intent i = getIntent();
MyParcelable myParcelableObject = (MyParcelable) i.getParcelableExtra("name_of_extra");

Wenn Ihre Objektklasse Parcelable und Serializable implementiert, stellen Sie sicher, dass Sie eine der folgenden Aktionen ausführen:

i.putExtra("parcelable_extra", (Parcelable) myParcelableObject);
i.putExtra("serializable_extra", (Serializable) myParcelableObject);

683



Sie müssen Ihr Objekt in eine Art String-Darstellung serialisieren. Eine mögliche Zeichenfolgendarstellung ist JSON, und eine der einfachsten Möglichkeiten, zu / von JSON in Android zu serialisieren, wenn Sie mich fragen, ist durch Google GSON.

In diesem Fall legst du den String-Rückgabewert ab (new Gson()).toJson(myObject); und den Zeichenfolgenwert abrufen und verwenden fromJson um es zurück in dein Objekt zu verwandeln.

Wenn Ihr Objekt jedoch nicht sehr komplex ist, ist es möglicherweise nicht den Overhead wert, und Sie könnten stattdessen die separaten Werte des Objekts übergeben.


160



Sie können serialisierbares Objekt über Absicht senden

// send where details is object
ClassName details = new ClassName();
Intent i = new Intent(context, EditActivity.class);
i.putExtra("Editing", details);
startActivity(i);


//receive
ClassName model = (ClassName) getIntent().getSerializableExtra("Editing");

And 

Class ClassName implements Serializable {
} 

142



Für Situationen, in denen Sie wissen, dass Sie Daten innerhalb einer Anwendung übergeben werden, verwenden Sie "globals" (wie statische Klassen)

Hier ist, was Dianne Hackborn (hackbod - ein Google Android Software Engineer) musste dazu sagen:

Für Situationen, in denen Sie wissen, dass die Aktivitäten identisch ausgeführt werden   Prozess, können Sie nur Daten über Globals teilen. Zum Beispiel, du   könnte eine globale haben HashMap<String, WeakReference<MyInterpreterState>>   und wenn Sie einen neuen MyInterpreterState erstellen, erhalten Sie einen eindeutigen Namen   dafür und steckte es in die Hash-Karte; um diesen Zustand an einen anderen zu senden   Aktivität, einfach den eindeutigen Namen in die Hash - Karte und wenn die   Die zweite Aktivität wird gestartet. Sie kann den MyInterpreterState abrufen   die Hash-Karte mit dem Namen, den sie erhält.


63



Ihre Klasse sollte Serializable oder Parcelable implementieren.

public class MY_CLASS implements Serializable

Danach können Sie ein Objekt auf putExtra senden

intent.putExtra("KEY", MY_CLASS_instance);

startActivity(intent);

Um Extras zu bekommen, müssen Sie nur tun

Intent intent = getIntent();
MY_CLASS class = (MY_CLASS) intent.getExtras().getSerializable("KEY");

Wenn Ihre Klasse Parcelable implementiert, verwenden Sie als Nächstes

MY_CLASS class = (MY_CLASS) intent.getExtras().getParcelable("KEY");

Ich hoffe es hilft: D


46



wenn Ihre Objektklasse implementiert ist Serializable, Sie müssen nichts anderes tun, Sie können ein serialisierbares Objekt übergeben.
 das ist was ich benutze.


27



Kurze Antwort für schnelles Bedürfnis

1. Implementieren Sie Ihre Klasse zu Serializable. 

Wenn Sie irgendwelche inneren Klassen haben, vergessen Sie nicht, sie auch in Serializable zu implementieren!

public class SportsData implements  Serializable
public class Sport implements  Serializable

List<Sport> clickedObj;

2. Setzen Sie Ihr Objekt auf Absicht 

 Intent intent = new Intent(SportsAct.this, SportSubAct.class);
            intent.putExtra("sport", clickedObj);
            startActivity(intent);

3. Und erhalten Sie Ihr Objekt in der anderen Aktivitätsklasse

Intent intent = getIntent();
    Sport cust = (Sport) intent.getSerializableExtra("sport");

24



Sie können Android BUNDLE dazu verwenden.

Erstelle ein Bündel aus deiner Klasse wie:

public Bundle toBundle() {
    Bundle b = new Bundle();
    b.putString("SomeKey", "SomeValue");

    return b;
}

Übergeben Sie dieses Paket dann mit INTENT. Jetzt können Sie Ihr Klassenobjekt neu erstellen, indem Sie bündelartig übergeben

public CustomClass(Context _context, Bundle b) {
    context = _context;
    classMember = b.getString("SomeKey");
}

Deklarieren Sie dies in Ihrer benutzerdefinierten Klasse und verwenden Sie sie.


16



Danke für die parzellierbare Hilfe, aber ich habe eine weitere optionale Lösung gefunden

 public class getsetclass implements Serializable {
        private int dt = 10;
    //pass any object, drwabale 
        public int getDt() {
            return dt;
        }

        public void setDt(int dt) {
            this.dt = dt;
        }
    }

In Aktivität Eins

getsetclass d = new getsetclass ();
                d.setDt(50);
                LinkedHashMap<String, Object> obj = new LinkedHashMap<String, Object>();
                obj.put("hashmapkey", d);
            Intent inew = new Intent(SgParceLableSampelActivity.this,
                    ActivityNext.class);
            Bundle b = new Bundle();
            b.putSerializable("bundleobj", obj);
            inew.putExtras(b);
            startActivity(inew);

Daten in Aktivität 2 abrufen

 try {  setContentView(R.layout.main);
            Bundle bn = new Bundle();
            bn = getIntent().getExtras();
            HashMap<String, Object> getobj = new HashMap<String, Object>();
            getobj = (HashMap<String, Object>) bn.getSerializable("bundleobj");
            getsetclass  d = (getsetclass) getobj.get("hashmapkey");
        } catch (Exception e) {
            Log.e("Err", e.getMessage());
        }

15



Implementiere Serialisierung in deiner Klasse

        public class Place implements Serializable{
        private int id;
        private String name;

        public void setId(int id) {
           this.id = id;
        }
        public int getId() {
           return id;
        }
        public String getName() {
           return name;
        }

        public void setName(String name) {
           this.name = name;
        }
        }

Dann können Sie dieses Objekt in Absicht übergeben

     Intent intent = new Intent(this, SecondAct.class);
     intent.putExtra("PLACE", Place);
     startActivity();

In der zweiten Aktivität können Sie Daten wie diese erhalten

     Place place= (Place) getIntent().getSerializableExtra("PLACE");

Aber wenn die Daten groß werden, wird diese Methode langsam sein.


15



Es gibt verschiedene Möglichkeiten, auf Variablen oder Objekte in anderen Klassen oder Aktivitäten zuzugreifen.

Eine Datenbank

B. geteilte Präferenzen.

C. Objektserialisierung

D. Eine Klasse, die allgemeine Daten enthalten kann, kann als Common Utilities bezeichnet werden, es hängt von Ihnen ab.

E. Übergeben von Daten über Intents und Parcelable Interface.

Es hängt von Ihren Projektanforderungen ab.

EIN. Datenbank

SQLite ist eine Open-Source-Datenbank, die in Android eingebettet ist. SQLite unterstützt standardmäßige relationale Datenbankfunktionen wie SQL-Syntax, Transaktionen und vorbereitete Anweisungen.

Anleitungen - http://www.vogella.com/articles/AndroidSQLite/article.html

B. Gemeinsame Einstellungen

Angenommen, Sie möchten den Benutzernamen speichern. Also wird es jetzt zwei Dinge geben Schlüssel Nutzername, Wert Wert.

Wie zu speichern

 // Create object of SharedPreferences.
 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
 //now get Editor
 SharedPreferences.Editor editor = sharedPref.edit();
 //put your value
 editor.putString("userName", "stackoverlow");

 //commits your edits
 editor.commit();

Mit putString (), putBoolean (), putInt (), putFloat (), putLong () können Sie Ihren gewünschten dtatype speichern.

Wie man holt

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

C. Objektserialisierung

Object serlization wird verwendet, wenn Sie einen Objektstatus speichern möchten, um ihn über das Netzwerk zu senden, oder Sie können ihn auch für Ihren Zweck verwenden.

Verwenden Sie Java-Beans und speichern Sie es als eines seiner Felder und verwenden Sie Getter und Setter dafür

JavaBeans sind Java-Klassen mit Eigenschaften. Denk an Eigenschaften als private Instanzvariablen. Da sie privat sind, der einzige Weg Sie können von außerhalb ihrer Klasse über Methoden in der Klasse zugegriffen werden. Das Methoden, die den Wert einer Eigenschaft ändern, werden als Setter-Methoden und Methoden bezeichnet die den Wert einer Eigenschaft abrufen, werden Getter-Methoden genannt.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

Setzen Sie die Variable in Ihrer Mail-Methode mit

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

Verwenden Sie dann das Objekt Serialzation, um dieses Objekt zu serialisieren und dieses Objekt in Ihrer anderen Klasse zu deserialisieren.

In der Serialisierung kann ein Objekt als eine Sequenz von Bytes dargestellt werden, die die Daten des Objekts sowie Informationen über den Typ des Objekts und die Arten von Daten enthält, die in dem Objekt gespeichert sind.

Nachdem ein serialisiertes Objekt in eine Datei geschrieben wurde, kann es aus der Datei gelesen und deserialisiert werden, dh die Typinformationen und Bytes, die das Objekt darstellen, und seine Daten können zum Wiederherstellen des Objekts im Speicher verwendet werden.

Wenn Sie Tutorial für diese möchten, verweisen Sie diesen Link

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

Variable in anderen Klassen abrufen

D. CommonUtilities

Sie können selbst eine Klasse erstellen, die allgemeine Daten enthalten kann, die Sie häufig in Ihrem Projekt benötigen.

Probe

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Daten über Intents übergeben

Bitte lesen Sie dieses Tutorial für diese Möglichkeit, Daten weiterzuleiten.

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/


14