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

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!!

7voto

Saad Farooq Punkte 12912

Eine andere Möglichkeit ist die Verwendung der Application Objekt (Android.app.Application). Sie definieren dies in Ihrem AndroidManifest.xml file as:

<application
    android:name=".MyApplication"
    ...

Sie können dies dann von jeder Aktivität aus aufrufen und das Objekt in der Application Klasse.

In der FirstActivity:

MyObject myObject = new MyObject();
MyApplication app = (MyApplication) getApplication();
app.setMyObject(myObject);

Führen Sie in der SecondActivity den Befehl :

MyApplication app = (MyApplication) getApplication();
MyObject retrievedObject = app.getMyObject(myObject);

Dies ist praktisch, wenn Sie Objekte haben, die einen Anwendungsbereich haben, d.h. sie müssen in der gesamten Anwendung verwendet werden. Die Parcelable Methode ist immer noch besser, wenn Sie eine explizite Kontrolle über den Objektbereich wünschen oder wenn der Bereich begrenzt ist.

Dadurch wird die Verwendung von Intents allerdings nicht ganz. Ich weiß nicht, ob sie zu Ihnen passen. Eine andere Möglichkeit, die ich genutzt habe, ist, dass ich int Identifikatoren von Objekten, die über Intents gesendet werden, und Abruf von Objekten, die ich in Maps in der Application Objekt.

1 Stimmen

Es ist nicht der richtige Weg, die Dinge zu tun, da die Objekte variabel sein können, kann Ihre Arbeit, wenn Sie über statische Objekt entlang des Lebenszyklus der Anwendung zu sprechen, aber einige Male brauchen wir passiing Objekte, die mit Webservice oder so generiert werden kann stackoverflow.com/a/2736612/716865

0 Stimmen

Ich habe es erfolgreich mit Objekten verwendet, die von Webservices generiert wurden, indem ich einen Anwendungsbereich Map in dem die Objekte unter Verwendung eines Bezeichners gespeichert und abgerufen werden. Das einzige wirkliche Problem mit diesem Ansatz ist, dass Android löscht Speicher nach einer Weile, so dass Sie für Nullen auf Ihre onResume überprüfen müssen (ich denke, dass Objekte in Intents übergeben werden persistiert, aber bin nicht sicher). Abgesehen davon sehe ich dies nicht als wesentlich schlechter.

0 Stimmen

Dies ist die beste Antwort. Sie zeigt, wie verschiedene Aktivitäten auf das gleiche Datenmodell verweisen können. Ich habe viel zu lange gebraucht, um das zu entdecken!

6voto

UMAR-MOBITSOLUTIONS Punkte 75058

Die einfachste Lösung, die ich gefunden habe, ist. eine Klasse mit statischen Datenelementen mit Getters Setters zu erstellen.

von einer Aktivität setzen und von einer anderen Aktivität dieses Objekt erhalten.

Tätigkeit A

mytestclass.staticfunctionSet("","",""..etc.);

Tätigkeit b

mytestclass obj= mytestclass.staticfunctionGet();

0 Stimmen

Dies ist nicht generisch genug, um eine beliebige Klasse zu unterstützen. Was werden Sie tun, wenn das benutzerdefinierte Objekt einen Dateiverweis enthält? Wollen Sie den Namen übergeben oder den Inhalt verarbeiten? Parcelable gibt einem solche Optionen über die Flag-Einstellungen.

1 Stimmen

Oder eine serialisierbare Klasse erstellen, um einer anderen Aktivität das zu übergeben, was Sie übergeben wollen.

10 Stimmen

Denken Sie nur daran, keine großen, fetten Gegenstände hineinzustellen. Die Lebensdauer dieses Objekts entspricht der Lebensdauer der Anwendung. Und speichern Sie niemals Ansichten. Diese Methode garantiert auch Speicherlecks.

5voto

MFP Punkte 1133

Android-Anwendung erstellen

Datei >> Neu >> Android-Anwendung

Projektname eingeben: Android-pass-object-to-activity

Pakcage: com.hmkcode.Android

Behalten Sie die anderen Einstellungen bei, gehen Sie weiter, bis Sie das Ziel erreicht haben.

Bevor wir mit der Erstellung der App beginnen, müssen wir die POJO-Klasse "Person" erstellen, die wir verwenden werden, um Objekte von einer Aktivität zur anderen zu senden. Beachten Sie, dass die Klasse die Schnittstelle Serializable implementiert.

Person.java

package com.hmkcode.android;
import java.io.Serializable;

public class Person implements Serializable{

    private static final long serialVersionUID = 1L;

    private String name;
    private int age;

        // getters & setters....

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }   
}

Zwei Layouts für zwei Aktivitäten

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/tvName"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:text="Name" />

    <EditText
        android:id="@+id/etName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:ems="10" >
        <requestFocus />
    </EditText>
</LinearLayout>

<LinearLayout
     android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
<TextView
    android:id="@+id/tvAge"
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center_horizontal"
    android:text="Age" />
<EditText
    android:id="@+id/etAge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10" />
</LinearLayout>

<Button
    android:id="@+id/btnPassObject"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="Pass Object to Another Activity" />

</LinearLayout>

activity_another.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
 >

<TextView
    android:id="@+id/tvPerson"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:layout_gravity="center"
    android:gravity="center_horizontal"
 />

</LinearLayout>

Zwei Aktivitätsklassen

1)ActivityMain.java

package com.hmkcode.android;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity implements OnClickListener {

Button btnPassObject;
EditText etName, etAge;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnPassObject = (Button) findViewById(R.id.btnPassObject);
    etName = (EditText) findViewById(R.id.etName);
    etAge = (EditText) findViewById(R.id.etAge);

    btnPassObject.setOnClickListener(this);
}

@Override
public void onClick(View view) {

    // 1. create an intent pass class name or intnet action name 
    Intent intent = new Intent("com.hmkcode.android.ANOTHER_ACTIVITY");

    // 2. create person object
    Person person = new Person();
    person.setName(etName.getText().toString());
    person.setAge(Integer.parseInt(etAge.getText().toString()));

    // 3. put person in intent data
    intent.putExtra("person", person);

    // 4. start the activity
    startActivity(intent);
}

}

2)AnotherActivity.java

package com.hmkcode.android;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class AnotherActivity extends Activity {

TextView tvPerson;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_another);

    // 1. get passed intent 
    Intent intent = getIntent();

    // 2. get person object from intent
    Person person = (Person) intent.getSerializableExtra("person");

    // 3. get reference to person textView 
    tvPerson = (TextView) findViewById(R.id.tvPerson);

    // 4. display name & age on textView 
    tvPerson.setText(person.toString());

}
}

5voto

Jinesh Francis Punkte 3039

Mit der Gson-Bibliothek von Google können Sie ein Objekt an eine andere Aktivität weitergeben, wobei wir das Objekt in Form eines Json-Strings konvertieren und nach der Weitergabe an eine andere Aktivität wieder in ein Objekt umwandeln

Betrachten Sie eine Bean-Klasse wie diese

 public class Example {
    private int id;
    private String name;

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

Wir müssen ein Objekt der Klasse Example übergeben

Example exampleObject=new Example(1,"hello");
String jsonString = new Gson().toJson(exampleObject);
Intent nextIntent=new Intent(this,NextActivity.class);
nextIntent.putExtra("example",jsonString );
startActivity(nextIntent);

Zum Lesen müssen wir den umgekehrten Vorgang in NextActivity durchführen

 Example defObject=new Example(-1,null);
    //default value to return when example is not available
    String defValue= new Gson().toJson(defObject);
    String jsonString=getIntent().getExtras().getString("example",defValue);
    //passed example object
    Example exampleObject=new Gson().fromJson(jsonString,Example .class);

Diese Abhängigkeit in gradle hinzufügen

compile 'com.google.code.gson:gson:2.6.2'

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