web-dev-qa-db-ja.com

インテントを使用して、あるAndroidアクティビティから別のAndroidアクティビティにオブジェクトを送信する方法

Intent クラスのputExtra()メソッドを使用して、1つの Activity から別のタイプにカスタムタイプのオブジェクトを渡すことができますか?

805
UMAR

私が見つけた最も簡単な解決策は..ゲッターセッターを持つ静的データメンバーを持つクラスを作成することです。

あるアクティビティから設定し、別のアクティビティからそのオブジェクトを取得します。

活動A

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

活動b

mytestclass obj= mytestclass.staticfunctionGet();
5
UMAR

オブジェクトを渡しているだけの場合は、 Parcelable がこの目的のために設計されています。 Javaのネイティブシリアライゼーションを使用するよりも少し努力する必要がありますが、それはかなり速いです(そして私は言い方をすれば、WAYfast)。

ドキュメントから、実装方法の簡単な例は次のとおりです。

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

特定の区画から取得するフィールドが複数ある場合は、それらを入力した順序と同じ順序で(つまり、[FIFOの方法で)実行する必要があります。

オブジェクトにParcelableを実装させると、それらを Intents with putExtra() に入れるだけです。

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

それなら getParcelableExtra() でそれらを引き出すことができます。

Intent i = getIntent();
MyParcelable myParcelableObject = (MyParcelable) i.getParcelableExtra("name_of_extra");

オブジェクトクラスがParcelableおよびSerializableを実装している場合は、必ず次のいずれかにキャストしてください。

i.putExtra("parcelable_extra", (Parcelable) myParcelableObject);
i.putExtra("serializable_extra", (Serializable) myParcelableObject);
719
Jeremy Logan

オブジェクトをある種の文字列表現にシリアル化する必要があります。考えられる文字列表現の1つはJSONです。AndroidでJSONとの間でシリアル化する最も簡単な方法の1つは、 Google GSON を使用することです。

その場合は、(new Gson()).toJson(myObject);から文字列の戻り値を入力して文字列値を取得し、fromJsonを使用してそれをオブジェクトに戻すだけです。

ただし、オブジェクトがそれほど複雑でない場合は、オーバーヘッドに見合うだけの価値はないかもしれません。代わりに、オブジェクトの個別の値を渡すことを検討してください。

181
David Hedlund

あなたは意図を通して直列化可能オブジェクトを送ることができます

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

アプリケーション内でデータを渡すことがわかっている場合は、「グローバル」を使用します(静的クラスと同様)。

ここ は何です Dianne Hackborn (hackbod - Google Androidソフトウェアエンジニア)は、この件について次のように述べています。

アクティビティが同じプロセスで実行されていることがわかっている場合は、グローバルを通じてデータを共有するだけで済みます。たとえば、グローバルなHashMap<String, WeakReference<MyInterpreterState>>を作成して、新しいMyInterpreterStateを作成すると、その名前に一意の名前が付けられてハッシュマップに入れられます。その状態を別のアクティビティに送信するには、単純に一意の名前をハッシュマップに入れて、2番目のアクティビティが開始されたときに、受け取った名前でハッシュマップからMyInterpreterStateを取得できます。

65
Peter Ajtai

あなたのクラスはSerializableまたはParcelableを実装するべきです。

public class MY_CLASS implements Serializable

完了したら、putExtraにオブジェクトを送信できます。

intent.putExtra("KEY", MY_CLASS_instance);

startActivity(intent);

余分なものを手に入れるには、あなたがしなければならないだけです。

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

あなたのクラスがParcelableを実装している場合

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

それが役立つことを願っています:D

46
Pedro Romão

早急な対応のための短い答え

1.クラスをSerializableに実装します。

内部クラスがある場合は、それらもSerializableに実装することを忘れないでください。

public class SportsData implements  Serializable
public class Sport implements  Serializable

List<Sport> clickedObj;

2.あなたのオブジェクトをIntentに入れてください

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

3.そして他のActivity Classであなたのオブジェクトを受け取ります

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

あなたのオブジェクトクラスがSerializableを実装していれば、他に何もする必要はありません、直列化可能オブジェクトを渡すことができます。
それが私が使っているものです。

27
Vlad

クラスに直列化可能を実装する

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

その後、このオブジェクトを意図的に渡すことができます

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

2番目のアクティビティでは、このようなデータを取得できます。

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

しかし、データが大きくなると、この方法は遅くなります。

17
Ishan Fernando

あなたはこれを行うためにAndroidのバンドルを使用することができます。

次のようにあなたのクラスからBundleを作成します。

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

    return b;
}

次にこのバンドルをINTENTで渡します。これで、次のようにbundleを渡してクラスオブジェクトを再作成できます。

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

これをカスタムクラスで宣言して使用します。

16
om252345

解析可能なヘルプをありがとう

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

アクティビティ1

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

活動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());
        }
15
user1140237

他のクラスやアクティビティの変数やオブジェクトにアクセスする方法はいくつかあります。

A.データベース

B.設定を共有しました。

C.オブジェクトの直列化.

D.共通データを保持できるクラスは、それがあなたに依存している共通ユーティリティとして名付けることができます。

E.インテントとParcelable Interfaceを通してデータを渡す。

プロジェクトのニーズによって異なります。

A. データベース

SQLiteは、Androidに組み込まれているオープンソースデータベースです。 SQLiteは、SQL構文、トランザクション、プリペアドステートメントなどの標準リレーショナルデータベース機能をサポートします。

チュートリアル - http://www.vogella.com/articles/AndroidSQLite/article.html

B. 共有設定

ユーザ名を保存したいとしましょう。そのため、 Key Username、 Value Valueの2つになります。

保存方法

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

putString()、putBoolean()、putInt()、putFloat()、putLong()を使用すると、希望のdtatypeを保存できます。

取得方法

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

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

C. オブジェクト直列化

オブジェクトの状態を保存してネットワーク経由で送信したい場合や、目的のためにも使用できる場合は、オブジェクトのセル化が使用されます。

Java Beansを使用し、それを彼のフィールドの1つとして格納し、そのためにgetterとsetterを使用します。

JavaBeansはプロパティを持つJavaクラスです。プロパティをプライベートインスタンス変数と見なします。これらは非公開なので、クラスの外部からアクセスできる唯一の方法は、クラス内のメソッドを使用することです。プロパティの値を変更するメソッドは設定メソッドと呼ばれ、プロパティの値を取得するメソッドは取得メソッドと呼ばれます。

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

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


}

を使用して、メールメソッドに変数を設定します。

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

次に、オブジェクト直列化を使用してこのオブジェクトを直列化し、他のクラスでこのオブジェクトを直列化復元します。

直列化では、オブジェクトは、オブジェクトのデータ、およびオブジェクトの種類とオブジェクトに格納されているデータの種類に関する情報を含む一連のバイトとして表すことができます。

シリアル化されたオブジェクトは、ファイルに書き込まれた後、ファイルから読み取られて逆シリアル化されます。つまり、オブジェクトとそのデータを表す型情報とバイトを使用して、オブジェクトをメモリに再作成できます。

このチュートリアルが欲しいならこのリンクを参照してください。

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

他のクラスの変数を取得する

D. CommonUtilities

プロジェクトで頻繁に必要となる共通のデータを含むことができるクラスを自分で作成することができます。

サンプル

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. インテントにデータを渡す

データを渡すこのオプションについては、このチュートリアルを参照してください。

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

14
Nikhil Agrawal

私はGsonとその強力でシンプルなAPIを使って、アクティビティ間でオブジェクトを送信します。

// 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つの機能

使用法

AからBへオブジェクトを送信

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

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

私はほとんどすべてのプロジェクトでそれを使っていますし、パフォーマンスの問題もありません。

13
MBH

あなたの最初の活動では:

intent.putExtra("myTag", yourObject);

そしてあなたの2番目のものでは:

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

カスタムオブジェクトをSerializableにすることを忘れないでください。

public class myCustomObject implements Serializable {
...
}
9
Rudi

私は同じ問題に苦労しました。私はそれをHashMapに欲しいデータを保存し、静的クラスを使って解決しました。一番上には、標準のActivityクラスの拡張機能を使用します。ここでは、データ転送とデータ消去を非表示にするために、onCreateメソッドとonDestroyメソッドをオーバーライドしました。いくつかのばかげた設定は変更する必要があります。オリエンテーション処理.

注釈:他のアクティビティに渡される一般的なオブジェクトを提供しないことは、お尻の痛みです。まるで自分自身を膝の中で撃って100メートルを勝ち取ることを望んでいるようなものです。 "Parcable"は十分な代替品ではありません。それは私を笑わせます...私はテクノロジーを含まないAPIにこのインターフェースを実装したくありません。新しいLayerを導入したくないからです。現代のパラダイム...

9
oopexpert

これを行うもう1つの方法は、Applicationオブジェクト(Android.app.Application)を使用することです。これをAndroidManifest.xmlファイルで次のように定義します。

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

その後、これを任意のアクティビティから呼び出して、そのオブジェクトをApplicationクラスに保存できます。

FirstActivityでは:

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

SecondActivityで、以下のことを行います。

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

これは、アプリケーションレベルのスコープを持つオブジェクト、つまりアプリケーション全体で使用する必要があるオブジェクトがある場合に便利です。オブジェクトのスコープを明示的に制御したい場合、またはスコープが制限されている場合は、Parcelableメソッドを使用したほうがよいでしょう。

しかしこれはIntentsの使用を完全に避けます。彼らがあなたに合っているかどうか私は知りません。これを使用したもう1つの方法は、オブジェクトのint識別子がインテントを介して送信し、Maps内のApplicationオブジェクト内にあるオブジェクトを取得することです。

7
Saad Farooq
public class SharedBooking implements Parcelable{

    public int account_id;
    public Double betrag;
    public Double betrag_effected;
    public int taxType;
    public int tax;
    public String postingText;

    public SharedBooking() {
        account_id = 0;
        betrag = 0.0;
        betrag_effected = 0.0;
        taxType = 0;
        tax = 0;
        postingText = "";
    }

    public SharedBooking(Parcel in) {
        account_id = in.readInt();
        betrag = in.readDouble();
        betrag_effected = in.readDouble();
        taxType = in.readInt();
        tax = in.readInt();
        postingText = in.readString();
    }

    public int getAccount_id() {
        return account_id;
    }
    public void setAccount_id(int account_id) {
        this.account_id = account_id;
    }
    public Double getBetrag() {
        return betrag;
    }
    public void setBetrag(Double betrag) {
        this.betrag = betrag;
    }
    public Double getBetrag_effected() {
        return betrag_effected;
    }
    public void setBetrag_effected(Double betrag_effected) {
        this.betrag_effected = betrag_effected;
    }
    public int getTaxType() {
        return taxType;
    }
    public void setTaxType(int taxType) {
        this.taxType = taxType;
    }
    public int getTax() {
        return tax;
    }
    public void setTax(int tax) {
        this.tax = tax;
    }
    public String getPostingText() {
        return postingText;
    }
    public void setPostingText(String postingText) {
        this.postingText = postingText;
    }
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(account_id);
        dest.writeDouble(betrag);
        dest.writeDouble(betrag_effected);
        dest.writeInt(taxType);
        dest.writeInt(tax);
        dest.writeString(postingText);

    }

    public static final Parcelable.Creator<SharedBooking> CREATOR = new Parcelable.Creator<SharedBooking>()
    {
        public SharedBooking createFromParcel(Parcel in)
        {
            return new SharedBooking(in);
        }
        public SharedBooking[] newArray(int size)
        {
            return new SharedBooking[size];
        }
    };

}

データを渡す:

Intent intent = new Intent(getApplicationContext(),YourActivity.class);
Bundle bundle = new Bundle();
i.putParcelableArrayListExtra("data", (ArrayList<? extends Parcelable>) dataList);
intent.putExtras(bundle);
startActivity(intent);

データを取得する:

Bundle bundle = getIntent().getExtras();
dataList2 = getIntent().getExtras().getParcelableArrayList("data");
6

あなたのクラスモデル(Object)にSerializableを実装してください。例えば:

public class MensajesProveedor implements Serializable {

    private int idProveedor;


    public MensajesProveedor() {
    }

    public int getIdProveedor() {
        return idProveedor;
    }

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


}

そしてあなたの最初の活動

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

そしてあなたの2番目のアクティビティ(NewActivity)

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

がんばろう!!

6
David Hackro

Androidアプリケーションを作成する

ファイル>>新規>> Androidアプリケーション

プロジェクト名を入力してください:Android-pass-object-to-activity

パックケージ:com.hmkcode.Android

他のデフォルト値を選択したまま、次へ進み、最後まで進みます

アプリの作成を始める前に、あるアクティビティから別のアクティビティにオブジェクトを送信するために使用するPOJOクラス「Person」を作成する必要があります。クラスがSerializableインタフェースを実装していることに注意してください。

人ジャワ

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

2つの活動のための2つのレイアウト

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>

2つの活動クラス

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

}
}
4
MFP

あなたのクラス型のオブジェクトを渡したり取得したりするためにputExtra(Serializable ..)とgetSerializableExtra()メソッドを使うことができます。あなたはあなたのクラスをSerializableとマークし、あなたの全てのメンバ変数もシリアル化可能であることを確認しなければならないでしょう...

4
null
Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);
startACtivity(i);
3
Manas Ranjan

私はこれが遅れていることを知っていますが、それは非常に簡単です。

public class MyClass implements Serializable{

}

それからあなたはのような意図に渡すことができます

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

それを得るためにあなたは簡単に電話をかける

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

GoogleのGsonライブラリを使用すると、オブジェクトを別のアクティビティに渡すことができます。実際には、オブジェクトをjson文字列の形式に変換し、他のアクティビティに渡した後は、このように再度オブジェクトに変換します。

このようなBeanクラスを考えます

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

Exampleクラスのオブジェクトを渡す必要があります

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

読むためには、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);

この依存をgradleに追加してください

compile 'com.google.code.gson:gson:2.6.2'
3
Jinesh Francis

モデルレイヤへのゲートウェイとして機能するシングルトンクラス(fx Service)がある場合は、そのクラスにゲッターとセッターを持つ変数を設定することで解決できます。

活動1の場合:

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

活動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.
}

インサービス:

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

このソリューションは、問題のオブジェクトのシリアル化やその他の「パッケージ化」を必要としません。しかし、それはあなたがとにかくこの種のアーキテクチャを使用している場合にのみ有益になります。

2
Kitalda

このアクティビティパスパラメータからBundleオブジェクトを介して別のアクティビティを開始します。

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "[email protected]");
startActivity(intent);

他のアクティビティを検索する(YourActivity)

String s = getIntent().getStringExtra("USER_NAME");

これは単純な種類のデータ型には問題ありません。しかし、アクティビティ間に複雑なデータを渡したい場合は、まずシリアル化する必要があります。

ここに私達に従業員モデルがあります

class Employee{
    private String empId;
    private int age;
    print Double salary;

    getters...
    setters...
}

あなたはこのような複雑なデータをシリアル化するためにGoogleが提供するGson libを使うことができます。

String strEmp = new Gson().toJson(emp);
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("EMP", strEmp);
startActivity(intent);

Bundle bundle = getIntent().getExtras();
    String empStr = bundle.getString("EMP");
            Gson gson = new Gson();
            Type type = new TypeToken<Employee>() {
            }.getType();
            Employee selectedEmp = gson.fromJson(empStr, type);
2
DroidNinja

最も簡単なのは、項目が文字列の場合は、単に次のようにします。

intent.putextra("selected_item",item)

受け取りについて:

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

オブジェクトを区画化するためのはるかに簡単な方法私見。解析可能にしたいオブジェクトの上に注釈タグを追加するだけです。

ライブラリからの例は以下の通りです 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; }
}
2
Ryan

最初に Parcelable をあなたのクラスに実装してください。それから、このようなオブジェクトを渡します。

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

パッケージ文字列は必要ではなく、文字列は両方のアクティビティで同じである必要があります。

_ reference _

2
Arpit Patel

PutExtra機能の使用にあまり興味がなく、単にオブジェクトを使って別のアクティビティを起動したい場合は、GNLauncher( https://github.com/noxiouswinter/gnlib_Android/wiki#ignlauncher )ライブラリをチェックアウトできますこのプロセスをもっと簡単にする試みで書いた。

GNLauncherは、必要なデータをパラメータとしてアクティビティ内の関数を呼び出すのと同じくらい簡単に、他のアクティビティなどからアクティビティにオブジェクト/データを送信することを可能にします。型安全を導入し、シリアル化する必要があること、文字列キーを使用して意図に従うこと、および反対側でそれを元に戻すことのすべての面倒を取り除きます。

1
jinais
We can send data one Activty1 to Activity2 with multiple ways like.
1- Intent
2- bundle
3- create an object and send through intent
.................................................
1 - Using intent
Pass the data through intent
Intent intentActivity1 = new Intent(Activity1.this, Activity2.class);
intentActivity1.putExtra("name", "Android");
startActivity(intentActivity1);
Get the data in Activity2 calss
Intent intent = getIntent();
if(intent.hasExtra("name")){
     String userName = getIntent().getStringExtra("name");
}
..................................................
2- Using Bundle
Intent intentActivity1 = new Intent(Activity1.this, Activity2.class);
Bundle bundle = new Bundle();
bundle.putExtra("name", "Android");
intentActivity1.putExtra(bundle);
startActivity(bundle);
Get the data in Activity2 calss
Intent intent = getIntent();
if(intent.hasExtra("name")){
     String userName = getIntent().getStringExtra("name");
}
..................................................
3-  Put your Object into Intent
Intent intentActivity1 = new Intent(Activity1.this, Activity2.class);
            intentActivity1.putExtra("myobject", myObject);
            startActivity(intentActivity1); 
 Receive object in the Activity2 Class
Intent intent = getIntent();
    Myobject obj  = (Myobject) intent.getSerializableExtra("myobject");
0
Ashish Kumar

コルティンで

Build.gradleにkotlin拡張を追加してください。

apply plugin: 'kotlin-Android-extensions'

Android {
    androidExtensions {
        experimental = true
   }
}

その後、このようにデータクラスを作成します。

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

意図を持ってオブジェクトを渡す

val sample = Sample(1,"naveen")

val intent = Intent(context, YourActivity::class.Java)
    intent.putExtra("id", sample)
    startActivity(intent)

意図を持ってオブジェクトを取得する

val sample = intent.getParcelableExtra("id")
0
Naveen
Start another activity from this activity pass parameters via Bundle Object

Intent intent = new Intent(this, YourActivity.class);
Intent.putExtra(AppConstants.EXTRAS.MODEL, cModel);
startActivity(intent);
Retrieve on another activity (YourActivity)

ContentResultData cModel = getIntent().getParcelableExtra(AppConstants.EXTRAS.MODEL);
0
Alok Singh

最も簡単なJavaの方法は、pojo/modelクラスにシリアライズ可能を実装することです。

パフォーマンスビューのAndroidに推奨:モデルを分割可能にする

0
Ashok Kumar

POJOクラス "Post "(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クラス "コメント" (Postクラスのメンバになっているので、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;
        }

    }

それからあなたの活動クラスで、あなたは他の活動にオブジェクトを渡すために次のようにすることができます。

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

        }
    });

あなたの受信者クラスでは "CommentsActivity" /あなたは次のようにデータを取得することができます

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