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

16voto

user1140237 Punkte 4927

Danke für die umfangreiche 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());
        }

1 Stimmen

Gute Antwort, aber erhöhen Sie Ihre Coding Standards... +1 aber für das bringen Serializable in den Wettbewerb jedoch Parcellables sind viel schneller...

14voto

MBH Punkte 15647

Ich verwende Gson mit seiner so mächtigen und einfachen API, um Objekte zwischen Aktivitäten zu senden,

Beispiel

// This is the object to be sent, can be any object
public class AndroidPacket {

    public String CustomerName;

   //constructor
   public AndroidPacket(String cName){
       CustomerName = cName;
   }   
   // other fields ....

    // You can add those functions as LiveTemplate !
    public String toJson() {
        Gson gson = new Gson();
        return gson.toJson(this);
    }

    public static AndroidPacket fromJson(String json) {
        Gson gson = new Gson();
        return gson.fromJson(json, AndroidPacket.class);
    }
}

2 Funktionen, die Sie zu den Objekten hinzufügen, die Sie senden möchten

Verwendung

Objekt von A nach B senden

    // Convert the object to string using Gson
    AndroidPacket androidPacket = new AndroidPacket("Ahmad");
    String objAsJson = androidPacket.toJson();

    Intent intent = new Intent(A.this, B.class);
    intent.putExtra("my_obj", objAsJson);
    startActivity(intent);

Empfangen in B

@Override
protected void onCreate(Bundle savedInstanceState) {        
    Bundle bundle = getIntent().getExtras();
    String objAsJson = bundle.getString("my_obj");
    AndroidPacket androidPacket = AndroidPacket.fromJson(objAsJson);

    // Here you can use your Object
    Log.d("Gson", androidPacket.CustomerName);
}

Ich verwende es fast bei jedem Projekt, und ich habe keine Leistungsprobleme.

0 Stimmen

Vielen Dank, das hat mir stundenlange Überkomplikationen erspart.

10voto

oopexpert Punkte 726

Ich kämpfte mit demselben Problem. Ich löste es durch die Verwendung einer statischen Klasse, die Speicherung von Daten, die ich in einer HashMap wollen. Darüber hinaus verwende ich eine Erweiterung der Standard-Activity-Klasse, in der ich die Methoden onCreate und onDestroy überschrieben habe, um den Datentransport und die Datenlöschung versteckt durchzuführen. Einige lächerliche Einstellungen müssen geändert werden, z.B. das Orientierungshandling.

Anmerkung: Keine allgemeinen Objekte zur Verfügung zu stellen, die an eine andere Aktivität weitergegeben werden können, ist eine Zumutung. Es ist, als würde man sich ins Knie schießen und hoffen, die 100 Meter zu gewinnen. "Parcable" ist kein ausreichender Ersatz. Es bringt mich zum Lachen... Ich möchte diese Schnittstelle nicht in meine technologiefreie API implementieren, genauso wenig wie ich einen neuen Layer einführen möchte... Wie kann es sein, dass wir in der mobilen Programmierung so weit weg vom modernen Paradigma sind...

9voto

Rudi Punkte 4290

In Ihrer ersten Aktivität:

intent.putExtra("myTag", yourObject);

Und in Ihrem zweiten:

myCustomObject myObject = (myCustomObject) getIntent().getSerializableExtra("myTag");

Vergessen Sie nicht, Ihr benutzerdefiniertes Objekt serialisierbar zu machen:

public class myCustomObject implements Serializable {
...
}

0 Stimmen

Parcelable ist besser als Serializable! Vermeiden Sie es, Serializable in Ihrem Android-Code zu verwenden!

7voto

David Hackro Punkte 3637

In Ihrem Klassenmodell (Object) Serializable implementieren, für Beispiel:

public class MensajesProveedor implements Serializable {

    private int idProveedor;

    public MensajesProveedor() {
    }

    public int getIdProveedor() {
        return idProveedor;
    }

    public void setIdProveedor(int idProveedor) {
        this.idProveedor = idProveedor;
    }

}

und Ihre erste Aktivität

MensajeProveedor mp = new MensajeProveedor();
Intent i = new Intent(getApplicationContext(), NewActivity.class);
                i.putExtra("mensajes",mp);
                startActivity(i);

und Ihre zweite Aktivität (NewActivity)

        MensajesProveedor  mensajes = (MensajesProveedor)getIntent().getExtras().getSerializable("mensajes");

viel Glück!!

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