vue - putextra android




Comment envoyer un objet d'une activité Android à une autre via Intents? (20)

Créer une application Android

Fichier >> Nouveau >> Application Android

Entrez le nom du projet: android-pass-object-to-activity

Pakcage: com.hmkcode.android

Gardez les autres sélections possibles, continuez jusqu'à ce que vous atteigniez Terminer

Avant de commencer à créer l'application, nous devons créer une classe POJO "Person" que nous utiliserons pour envoyer un objet d'une activité à une autre. Notez que la classe est en train d'implémenter l'interface Serializable.

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 + "]";
    }   
}

Deux mises en page pour deux activités

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>

Deux classes d'activité

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

}
}

Comment puis-je passer un objet d'un type personnalisé d'une Activity à une autre en utilisant la méthode putExtra() de la classe Intent ?


Dans votre première activité:

intent.putExtra("myTag", yourObject);

Et dans votre deuxième:

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

Ne pas oublier de faire votre objet personnalisé Serializable:

public class myCustomObject implements Serializable {
...
}

Il existe plusieurs façons d'accéder à des variables ou à des objets dans d'autres classes ou activités.

A. Base de données

B. préférences partagées.

C. Sérialisation d'objet.

D. Une classe qui peut contenir des données communes peut être nommée Common Utilities, elle dépend de vous.

E. Transmettre des données via Intents et Interface Parcelable.

Cela dépend des besoins de votre projet.

A. Base de données

SQLite est une base de données Open Source intégrée dans Android. SQLite prend en charge les fonctionnalités de base de données relationnelles standard telles que la syntaxe SQL, les transactions et les instructions préparées.

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

B. Préférences partagées

Supposons que vous voulez stocker le nom d'utilisateur. Donc, il y aura maintenant deux choses un nom d'utilisateur clé , Value Value.

Comment stocker

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

En utilisant putString (), putBoolean (), putInt (), putFloat (), putLong (), vous pouvez enregistrer votre dtatype désiré.

Comment chercher

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

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

C. Sérialisation d'objet

La sérlisation d'objet est utilisée si nous voulons enregistrer un état d'objet pour l'envoyer sur le réseau ou vous pouvez également l'utiliser pour votre objectif.

Utilisez des haricots java et stockez-y comme l'un de ses champs et utilisez des getters et des setters pour cela

JavaBeans sont des classes Java qui ont des propriétés. Considérez les propriétés comme des variables d'instance privées. Comme ils sont privés, la seule façon d'accéder à l'extérieur de leur classe est d'utiliser des méthodes dans la classe. Les méthodes qui modifient la valeur d'une propriété sont appelées méthodes setter, et les méthodes qui récupèrent la valeur d'une propriété sont appelées méthodes getter.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

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


}

Définissez la variable dans votre méthode de messagerie en utilisant

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

Utilisez ensuite la sérialisation de l'objet pour sérialiser cet objet et, dans votre autre classe, désérialisez cet objet.

En sérialisation, un objet peut être représenté comme une séquence d'octets qui inclut les données de l'objet ainsi que des informations sur le type de l'objet et les types de données stockées dans l'objet.

Après qu'un objet sérialisé a été écrit dans un fichier, il peut être lu à partir du fichier et désérialisé, les informations de type et les octets qui représentent l'objet et ses données peuvent être utilisés pour recréer l'objet en mémoire.

Si vous voulez un tutoriel pour cela, référez-vous à ce lien

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

Obtenir variable dans d'autres classes

D. CommonUtilities

Vous pouvez créer une classe par vous-même qui peut contenir des données communes dont vous avez souvent besoin dans votre projet.

Échantillon

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Transmettre des données par des intentions

Veuillez vous référer à ce tutoriel pour cette option de transmission de données.

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


J'ai lutté avec le même problème. Je l'ai résolu en utilisant une classe statique, en stockant toutes les données que je veux dans un HashMap. En haut j'utilise une extension de la classe d'activité standard où j'ai passé outre les méthodes onCrée un onDestroy pour faire le transport de données et l'effacement des données cachées. Certains paramètres ridicules doivent être modifiés, par exemple, le traitement d'orientation.

Annotation: ne pas fournir d'objets généraux à transmettre à une autre activité est une douleur dans le cul. C'est comme se tirer une balle dans le genou et espérer gagner 100 mètres. "Parcable" n'est pas un substitut suffisant. Ça me fait rire ... Je ne veux pas implémenter cette interface dans mon API sans technologie, car moins je veux introduire un nouveau calque ... Comment ça se fait, que nous sommes dans la programmation mobile si loin de paradigme moderne ...


Je sais que c'est en retard mais c'est très simple. Tout ce que vous avez à faire est de laisser votre classe implémenter Serializable comme

public class MyClass implements Serializable{

}

alors vous pouvez passer à une intention comme

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

Pour l'obtenir, vous appelez simplement

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

Merci pour l'aide parcelable mais j'ai trouvé une solution plus optionnelle

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

Dans l'activité un

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

Obtenir des données dans l'activité 2

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

Réponse courte pour un besoin rapide

1. Implémentez votre classe pour implémenter Serializable.

Si vous avez des classes internes, n'oubliez pas de les implémenter à Serializable aussi !!

public class SportsData implements  Serializable
public class Sport implements  Serializable

List<Sport> clickedObj;

2. Mettez votre objet à Intention

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

3. Et recevez votre objet dans l'autre classe d'activité

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

Si votre classe d'objets implémente Serializable , vous n'avez rien d'autre à faire, vous pouvez passer un objet sérialisable.
C'est ce que j'utilise.


Une autre méthode consiste à utiliser l'objet Application (android.app.Application). Vous définissez ceci dans votre fichier AndroidManifest.xml comme:

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

Vous pouvez ensuite l'appeler à partir de n'importe quelle activité et enregistrer l'objet dans la classe Application .

Dans la première activité:

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

Dans la deuxième activité, faites:

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

C'est pratique si vous avez des objets qui ont une portée au niveau de l'application, c'est-à-dire qu'ils doivent être utilisés dans toute l'application. La méthode Parcelable est toujours préférable si vous souhaitez un contrôle explicite sur la portée de l'objet ou si la portée est limitée.

Cela évite l'utilisation d' Intents tout à fait, cependant. Je ne sais pas si ça te va. Une autre façon dont j'ai utilisé ceci est d'avoir des identifiants int d'objets envoyés par des intentions et de récupérer des objets que j'ai dans Maps dans l'objet Application .


Votre classe devrait implémenter Serializable ou Parcelable.

public class MY_CLASS implements Serializable

Une fois cela fait, vous pouvez envoyer un objet sur putExtra

intent.putExtra("KEY", MY_CLASS_instance);

startActivity(intent);

Pour obtenir des extras, il suffit de faire

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

Si votre classe implémente l'utilisation Parcelable suivante

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

J'espère que ça aide: D


Vous pouvez envoyer un objet sérialisable par intention

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

Vous pouvez utiliser Android BUNDLE pour ce faire.

Créez un ensemble de votre classe comme:

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

    return b;
}

Puis passez ce paquet avec INTENT. Vous pouvez maintenant recréer votre objet de classe en transmettant un paquet comme

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

Déclarez ceci dans votre classe et utilisation personnalisée.


implémenter sérialisable dans votre classe

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

Ensuite, vous pouvez passer cet objet dans l'intention

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

int la deuxième activité, vous pouvez obtenir des données comme celle-ci

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

Mais quand les données deviennent grandes, cette méthode sera lente.


la solution la plus simple que j'ai trouvée est .. pour créer une classe avec des membres de données statiques avec des setters getters.

mettre d'une activité et obtenir d'une autre activité cet objet.

activité A

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

activité b

mytestclass obj= mytestclass.staticfunctionGet();

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 class "Comment" (Étant membre de la classe Post, il est également nécessaire pour implémenter le Serializable)

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

    }

Ensuite, dans votre classe d'activité, vous pouvez faire comme suit pour passer l'objet à une autre activité.

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

        }
    });

Dans votre classe de destinataire "CommentsActivity" vous pouvez obtenir les données comme suit

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