android - titel - title tag länge




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

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());
        }

Wie kann ich ein Objekt eines benutzerdefinierten Typs mit der Methode putExtra() der Klasse Intent von einer Activity an eine andere putExtra() ?


Die einfachste Lösung, die ich gefunden habe, ist ... eine Klasse mit statischen Datenmitgliedern mit Getter-Setter zu erstellen.

setze aus einer Aktivität und erhalte von einer anderen Aktivität das Objekt.

Aktivität

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

Aktivität b

mytestclass obj= mytestclass.staticfunctionGet();

Erstellen Sie eine Android-Anwendung

Datei >> Neu >> Android-Anwendung

Geben Sie den Projektnamen ein: android-pass-object-to-activity

Pakcage: com.hmkcode.android

Behalte andere defaults Selektionen, gehe Next, bis du Finish erreichst

Bevor wir mit dem Erstellen der App beginnen, müssen wir die POJO-Klasse "Person" erstellen, mit der wir Objekte von einer Aktivität zur nächsten senden können. Beachten Sie, dass die Klasse eine serialisierbare Schnittstelle 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());

}
}

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.

A. 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.

Tutorials - 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: einen Schlüssel- Benutzernamen, einen 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. Stellen Sie sich Eigenschaften als private Instanzvariablen vor. Da sie privat sind, können sie nur von außerhalb ihrer Klasse über Methoden in der Klasse aufgerufen werden. Die Methoden, die den Wert einer Eigenschaft ändern, werden Setter-Methoden genannt, und die Methoden, 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. Übergeben von Daten durch Intents

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/


Ich benutze 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 fügen Sie sie zu den Objekten hinzu, 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);

In B empfangen

@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 benutze es fast in jedem Projekt, das ich mache, und ich habe keine Leistungsprobleme.


Ich habe mit dem gleichen Problem gekämpft. Ich löste es, indem ich eine statische Klasse verwendete und alle Daten speicherte, die ich in einer HashMap haben wollte. Darüber hinaus verwende ich eine Erweiterung der Standard-Activity-Klasse, in der ich die Methoden onCreate an onDestroy überschrieben habe, um den Datentransport und die Datenlöschung ausgeblendet zu machen. Einige lächerliche Einstellungen müssen geändert werden, zB die Orientierung.

Anmerkung: Die Bereitstellung allgemeiner Objekte, die an eine andere Aktivität übergeben werden, ist kein Ärger. Es ist, als ob man sich selbst ins Knie schießen und hoffen würde, 100 Meter zu gewinnen. "Parcable" ist kein ausreichender Ersatz. Es bringt mich zum Lachen ... Ich möchte diese Schnittstelle nicht zu meiner Technologie-freien API implementieren, da ich weniger eine neue Schicht einführen möchte ... Wie könnte es sein, dass wir in der mobilen Programmierung so weit weg sind modernes Paradigma ...


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


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.


Kurze Antwort für schnelles Bedürfnis

1. Implementieren Sie Ihre Klasse, um Serializable zu implementieren.

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");

Mit Googles Gson-Bibliothek können Sie Objekte an andere Aktivitäten übergeben. Wir werden Objekte in der Form von JSON-Strings konvertieren und nach der Übergabe an andere Aktivitäten werden wir wieder in ein Objekt wie dieses 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 das Objekt der Example-Klasse ü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);

For reading we need to do the reverse operation in NextActivity

 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);

Add this dependancy in gradle

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

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


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 {
} 

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


Wenn Sie nur Objekte Parcelable wurde Parcelable dafür entworfen. Es erfordert ein wenig mehr Aufwand als die native Serialisierung von Java, aber es ist viel schneller (und ich meine Weise, viel 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 (also in einem FIFO-Ansatz).

Sobald Sie Ihre Objekte in Parcelable implementiert haben, Parcelable sie nur noch mit putExtra() in Ihre Intents putExtra() :

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

Dann können Sie sie mit getParcelableExtra() wieder 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);

By far the easiest way IMHO to parcel objects. You just add an annotation tag above the object you wish to make parcelable.

An example from the library is below 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; }
}

First implement Parcelable in your class. Then pass object like this.

SendActivity.java

ObjectA obj = new ObjectA();

// Set values etc.

Intent i = new Intent(this, MyActivity.class);
i.putExtra("com.package.ObjectA", obj);

startActivity(i);

ReceiveActivity.java

Bundle b = getIntent().getExtras();
ObjectA obj = b.getParcelable("com.package.ObjectA");

The package string isn't necessary, just the string needs to be the same in both Activities

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


If you have a singleton class (fx Service) acting as gateway to your model layer anyway, it can be solved by having a variable in that class with getters and setters for it.

In Activity 1:

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

In Activity 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.
}

In Service:

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;
}

This solution does not require any serialization or other "packaging" of the object in question. But it will only be beneficial if you are using this kind of architecture anyway.


POJO class "Post " (Note that it is implemented Serializable)

package com.example.booklib;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import android.graphics.Bitmap;

public class Post implements Serializable{
    public String message;
    public String bitmap;
    List<Comment> commentList = new ArrayList<Comment>();
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public String getBitmap() {
        return bitmap;
    }
    public void setBitmap(String bitmap) {
        this.bitmap = bitmap;
    }
    public List<Comment> getCommentList() {
        return commentList;
    }
    public void setCommentList(List<Comment> commentList) {
        this.commentList = commentList;
    }

}

POJO-Klasse "Kommentar" (Da es sich um ein Mitglied der Post-Klasse handelt, ist es auch notwendig, das Serializable zu implementieren)

    package com.example.booklib;

    import java.io.Serializable;

    public class Comment implements Serializable{
        public String message;
        public String fromName;
        public String getMessage() {
            return message;
        }
        public void setMessage(String message) {
            this.message = message;
        }
        public String getFromName() {
            return fromName;
        }
        public void setFromName(String fromName) {
            this.fromName = fromName;
        }

    }

In Ihrer Aktivitätsklasse können Sie dann folgendermaßen vorgehen, um das Objekt an eine andere Aktivität zu übergeben.

ListView listview = (ListView) findViewById(R.id.post_list);
listview.setOnItemClickListener(new OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Post item = (Post)parent.getItemAtPosition(position);
            Intent intent = new Intent(MainActivity.this,CommentsActivity.class);
            intent.putExtra("post",item);
            startActivity(intent);

        }
    });

In Ihrer Empfängerklasse "CommentsActivity" erhalten Sie die Daten wie folgt

Post post =(Post)getIntent().getSerializableExtra("post");

The simplest would be to just use the following where the item is a string:

intent.putextra("selected_item",item)

For receiving:

String name = data.getStringExtra("selected_item");

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






android-activity