932 Stimmen

Wie sendet man ein Objekt von einer Android-Aktivität zu einer anderen mit Intents?

Wie kann ich ein Objekt eines benutzerdefinierten Typs von einem Tätigkeit zu einem anderen unter Verwendung der putExtra() Methode der Klasse Absicht ?

0 Stimmen

@UMMA - Sie brauchen Ihre Fragen nicht ständig als "Community Wiki" zu markieren. Schauen Sie hier nach: meta.stackexchange.com/questions/11740/

1 Stimmen

@Paresh: Der von Ihnen angegebene Link ist defekt. Könnten Sie bitte eine Alternative angeben?

0 Stimmen

4voto

suulisin Punkte 1405

Ich weiß, dass dies spät ist, aber es ist sehr einfach: Alles, was Sie tun müssen, ist, dass Ihre Klasse Serializable implementiert wie

public class MyClass implements Serializable{

}

dann können Sie an einen Intent übergeben wie

Intent intent=......
MyClass obje=new MyClass();
intent.putExtra("someStringHere",obje);

Um sie zu erhalten, rufen Sie einfach an

MyClass objec=(MyClass)intent.getExtra("theString");

4voto

Ashok Kumar Punkte 1148

Der einfachste Weg ist: Implementieren Sie serializable in Ihrer Pojo/Model-Klasse.

Empfohlen für Android für die Leistungsansicht: Modell paketierbar machen

4voto

null Punkte 98

Sie können die Methoden putExtra(Serializable..) und getSerializableExtra() verwenden, um Objekte Ihres Klassentyps zu übergeben und abzurufen; Sie müssen Ihre Klasse als serialisierbar kennzeichnen und sicherstellen, dass alle Ihre Membervariablen ebenfalls serialisierbar sind...

3voto

Ryhan Punkte 1735

Das ist IMHO bei weitem der einfachste Weg, Objekte zu parzellieren. Sie fügen einfach ein Anmerkungs-Tag über dem Objekt hinzu, das Sie parzellierbar machen möchten.

Nachfolgend ein Beispiel aus der Bibliothek https://github.com/johncarl81/parceler

@Parcel
public class Example {
    String name;
    int age;

    public Example(){ /*Required empty bean constructor*/ }

    public Example(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public String getName() { return name; }

    public int getAge() { return age; }
}

3voto

Kitalda Punkte 341

Wenn Sie ohnehin eine Singleton-Klasse (fx Service) haben, die als Gateway zu Ihrer Modellschicht fungiert, kann das Problem gelöst werden, indem Sie eine Variable in dieser Klasse mit Gettern und Settern für sie haben.

In Aktivität 1:

Intent intent = new Intent(getApplicationContext(), Activity2.class);
service.setSavedOrder(order);
startActivity(intent);

In Aktivität 2:

private Service service;
private Order order;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_quality);

    service = Service.getInstance();
    order = service.getSavedOrder();
    service.setSavedOrder(null) //If you don't want to save it for the entire session of the app.
}

Im Dienst:

private static Service instance;

private Service()
{
    //Constructor content
}

public static Service getInstance()
{
    if(instance == null)
    {
        instance = new Service();
    }
    return instance;
}
private Order savedOrder;

public Order getSavedOrder()
{
    return savedOrder;
}

public void setSavedOrder(Order order)
{
    this.savedOrder = order;
}

Diese Lösung erfordert keine Serialisierung oder andere "Verpackung" des betreffenden Objekts. Sie ist aber nur dann von Vorteil, wenn Sie diese Art von Architektur ohnehin verwenden.

0 Stimmen

Was sind die Nachteile dieses Ansatzes? Es scheint so logisch und schlank zu sein. Ich lese immer, dass man das nicht tun sollte, aber ich bekomme nie eine gute Erklärung dafür, was schief gehen könnte.

0 Stimmen

Da ich meinen Kommentar nicht mehr bearbeiten kann: Ist dies nicht die einzig mögliche Lösung, um einen Verweis auf ein Objekt statt einer Kopie zu erhalten? Ich muss das gleiche Objekt abrufen und nicht eine Kopie!

0 Stimmen

Ich denke, davon wird wegen der hohen Kopplung, die dadurch entsteht, eher abgeraten. Aber ja, soweit ich sehen kann, ist dieser Ansatz der praktikabelste, wenn Sie das eigentliche Objekt benötigen. Wie immer beim Programmieren kann man tun, was man will, man muss es nur sorgfältig tun. Diese Lösung hat bei mir funktioniert, und ich bevorzuge sie, da ich diese Architektur ohnehin verwende.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X