How to send an object from one Android Activity to another using Intents?

后端 未结 30 3578
-上瘾入骨i
-上瘾入骨i 2020-11-21 04:47

How can I pass an object of a custom type from one Activity to another using the putExtra() method of the class Intent?

相关标签:
30条回答
  • 2020-11-21 05:19

    Using google's Gson library you can pass object to another activities.Actually we will convert object in the form of json string and after passing to other activity we will again re-convert to object like this

    Consider a bean class like this

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

    We need to pass object of Example class

    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'
    
    0 讨论(0)
  • 2020-11-21 05:21

    Thanks for parcelable help but i found one more optional solution

     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 Activity One

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

    Get Data In Activity 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());
            }
    
    0 讨论(0)
  • 2020-11-21 05:21

    Another way to do this is to use the Application object (android.app.Application). You define this in you AndroidManifest.xml file as:

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

    You can then call this from any activity and save the object to the Application class.

    In the FirstActivity:

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

    In the SecondActivity, do :

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

    This is handy if you have objects that have application level scope i.e. they have to be used throughout the application. The Parcelable method is still better if you want explicit control over the object scope or if the scope is limited.

    This avoid the use of Intents altogether, though. I don't know if they suits you. Another way I used this is to have int identifiers of objects send through intents and retrieve objects that I have in Maps in the Application object.

    0 讨论(0)
  • 2020-11-21 05:22

    Create Android Application

    File >> New >> Android Application

    Enter Project name: android-pass-object-to-activity

    Pakcage: com.hmkcode.android

    Keep other defualt selections, go Next till you reach Finish

    Before start creating the App we need to create POJO class “Person” which we will use to send object from one activity to another. Notice that the class is implementing Serializable interface.

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

    Two Layouts for Two Activities

    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>
    

    Two Activity Classes

    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());
    
    }
    }
    
    0 讨论(0)
  • 2020-11-21 05:22
    Intent i = new Intent();
    i.putExtra("name_of_extra", myParcelableObject);
    startACtivity(i);
    
    0 讨论(0)
  • 2020-11-21 05:22

    In Koltin

    Add kotlin extension in your build.gradle.

    apply plugin: 'kotlin-android-extensions'
    
    android {
        androidExtensions {
            experimental = true
       }
    }
    

    Then create your data class like this.

    @Parcelize
    data class Sample(val id: Int, val name: String) : Parcelable
    

    Pass Object with Intent

    val sample = Sample(1,"naveen")
    
    val intent = Intent(context, YourActivity::class.java)
        intent.putExtra("id", sample)
        startActivity(intent)
    

    Get object with intent

    val sample = intent.getParcelableExtra("id")
    
    0 讨论(0)
提交回复
热议问题