Intentクラスのメソッドを使用して、カスタムタイプのオブジェクトをあるアクティビティから別のアクティビティに渡すにはどうすればよいですか?
putExtra()
35 に答える
オブジェクトを渡すだけの場合、Parcelableはこのために設計されました。Javaのネイティブシリアル化を使用するよりも少し手間がかかりますが、はるかに高速です(つまり、はるかに高速です)。
ドキュメントから、実装方法の簡単な例は次のとおりです。
// 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
したら、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);
オブジェクトをある種の文字列表現にシリアル化する必要があります。考えられる文字列表現の1つはJSONであり、AndroidでJSONとの間でシリアル化する最も簡単な方法の1つは、GoogleGSONを使用することです。
その場合は、文字列の戻り値をから入れて文字列(new Gson()).toJson(myObject);
の値を取得し、それを使用fromJson
してオブジェクトに戻します。
ただし、オブジェクトがそれほど複雑でない場合は、オーバーヘッドの価値がない可能性があるため、代わりにオブジェクトの個別の値を渡すことを検討できます。
インテントを介してシリアル化可能なオブジェクトを送信できます
// 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 {
}
アプリケーション内でデータを渡すことがわかっている状況では、「グローバル」(静的クラスなど)を使用します
Dianne Hackborn ( hackbod -Google Androidソフトウェアエンジニア)がこの問題について言わなければならなかったことは次のとおりです。
アクティビティが同じプロセスで実行されていることがわかっている状況では、グローバルを介してデータを共有できます。たとえば、グローバル
HashMap<String, WeakReference<MyInterpreterState>>
を作成し、新しいMyInterpreterStateを作成するときに、その一意の名前を考え出し、ハッシュマップに配置することができます。その状態を別のアクティビティに送信するには、一意の名前をハッシュマップに入力するだけで、2番目のアクティビティが開始されると、受け取った名前でハッシュマップからMyInterpreterStateを取得できます。
クラスは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
迅速なニーズに対する短い答え
1.クラスをSerializableに実装します。
内部クラスがある場合は、Serializableにも実装することを忘れないでください!!
public class SportsData implements Serializable
public class Sport implements Serializable
List<Sport> clickedObj;
2.オブジェクトをインテントに入れます
Intent intent = new Intent(SportsAct.this, SportSubAct.class);
intent.putExtra("sport", clickedObj);
startActivity(intent);
3.そして他のアクティビティクラスでオブジェクトを受け取ります
Intent intent = getIntent();
Sport cust = (Sport) intent.getSerializableExtra("sport");
クラスにシリアライズ可能を実装する
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(intent);
このようなデータを取得できる2番目のアクティビティ
Place place= (Place) getIntent().getSerializableExtra("PLACE");
ただし、データが大きくなると、この方法は遅くなります。
オブジェクトクラスが実装されているSerializable
場合は、他に何もする必要はありません。シリアル化可能なオブジェクトを渡すことができます。
それが私が使っているものです。
他のクラスまたはアクティビティの変数またはオブジェクトにアクセスする方法はいくつかあります。
A.データベース
B.共有設定。
C.オブジェクトのシリアル化。
D.共通データを保持できるクラスは、ユーザーによって異なりますが、CommonUtilitiesという名前を付けることができます。
E.インテントおよびパーセル可能インターフェースを介したデータの受け渡し。
プロジェクトのニーズによって異なります。
A.データベース
SQLiteは、Androidに組み込まれているオープンソースデータベースです。SQLiteは、SQL構文、トランザクション、プリペアドステートメントなどの標準のリレーショナルデータベース機能をサポートしています。
チュートリアル-http ://www.vogella.com/articles/AndroidSQLite/article.html
B.共有設定
ユーザー名を保存するとします。したがって、キーユーザー名であるValueValueの2つがあります。
保存方法
// Create an 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クラスです。プロパティをプライベートインスタンス変数と考えてください。それらはプライベートであるため、クラスの外部からアクセスできる唯一の方法は、クラス内のメソッドを使用することです。プロパティの値を変更するメソッドはsetterメソッドと呼ばれ、プロパティの値を取得するメソッドはgetterメソッドと呼ばれます。
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);
次に、オブジェクトSerialzationを使用してこのオブジェクトをシリアル化し、他のクラスでこのオブジェクトを逆シリアル化します。
シリアル化では、オブジェクトは、オブジェクトのデータ、およびオブジェクトのタイプとオブジェクトに格納されているデータのタイプに関する情報を含むバイトのシーケンスとして表すことができます。
シリアル化されたオブジェクトがファイルに書き込まれた後、ファイルから読み取って逆シリアル化できます。つまり、オブジェクトとそのデータを表すタイプ情報とバイトを使用して、オブジェクトをメモリに再作成できます。
このためのチュートリアルが必要な場合は、このリンクを参照してください
http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html
D. CommonUtilities
プロジェクトで頻繁に必要となる一般的なデータを含むクラスを自分で作成できます。
サンプル
public class CommonUtilities {
public static String className = "CommonUtilities";
}
E.インテントを介したデータの受け渡し
データを渡すこのオプションについては、このチュートリアルを参照してください。
これを行うには、androidBUNDLEを使用できます。
次のように、クラスからバンドルを作成します。
public Bundle toBundle() {
Bundle b = new Bundle();
b.putString("SomeKey", "SomeValue");
return b;
}
次に、このバンドルをINTENTで渡します。これで、次のようなバンドルを渡すことでクラスオブジェクトを再作成できます。
public CustomClass(Context _context, Bundle b) {
context = _context;
classMember = b.getString("SomeKey");
}
カスタムクラスでこれを宣言して使用します。
パーセル可能なヘルプをありがとう、しかし私はもう一つのオプションの解決策を見つけました
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());
}
非常に強力でシンプルなAPIを備えたGsonを使用して、アクティビティ間でオブジェクトを送信します。
例
// 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);
}
ほぼすべてのプロジェクトで使用しており、パフォーマンスの問題はありません。
私は同じ問題に苦しんでいました。静的クラスを使用して、必要なデータをHashMapに格納することで解決しました。さらに、標準のActivityクラスの拡張機能を使用して、onCreate onDestroyメソッドをオーバーライドして、データ転送とデータクリアリングを非表示にしました。いくつかのばかげた設定を変更する必要があります。たとえば、向きの処理などです。
注釈:別のアクティビティに渡される一般的なオブジェクトを提供しないことは、お尻の痛みです。それは、ひざまずいて100メートルを勝ち取ることを望んでいるようなものです。「Parcable」は十分な代替品ではありません。それは私を笑わせます...私は新しいレイヤーを導入したいので、テクノロジーフリーのAPIにこのインターフェースを実装したくありません...私たちが遠く離れたモバイルプログラミングにいるのはどうしてですか?現代のパラダイム...
最初のアクティビティ:
intent.putExtra("myTag", yourObject);
そしてあなたの2番目のものでは:
myCustomObject myObject = (myCustomObject) getIntent().getSerializableExtra("myTag");
カスタムオブジェクトをシリアル化可能にすることを忘れないでください。
public class myCustomObject implements Serializable {
...
}
これを行う別の方法は、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
、オブジェクトの識別子をインテントを介して送信し、オブジェクトのマップにあるApplication
オブジェクトを取得することです。
クラスモデル(オブジェクト)で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");
幸運を!!
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");
私が見つけた最も簡単な解決策は、ゲッターセッターを使用して静的データメンバーを含むクラスを作成することです。
あるアクティビティから設定し、そのオブジェクトを別のアクティビティから取得します。
アクティビティA
mytestclass.staticfunctionSet("","",""..etc.);
活動b
mytestclass obj= mytestclass.staticfunctionGet();
グーグルの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'
putExtra(Serializable ..)メソッドとgetSerializableExtra()メソッドを使用して、クラスタイプのオブジェクトを渡したり取得したりできます。クラスをSerializableとマークし、すべてのメンバー変数もSerializableであることを確認する必要があります...
Androidアプリケーションを作成する
ファイル>>新規>>Androidアプリケーション
プロジェクト名を入力してください:android-pass-object-to-activity
Pakcage:com.hmkcode.android
他のデフォルトの選択を保持し、完了に達するまで次へ進みます
アプリの作成を開始する前に、あるアクティビティから別のアクティビティにオブジェクトを送信するために使用するPOJOクラス「Person」を作成する必要があります。クラスが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 + "]";
}
}
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());
}
}
これは遅いことは知っていますが、非常に簡単です。クラスにSerializableを実装させるだけです。
public class MyClass implements Serializable{
}
次に、次のようなインテントに渡すことができます
Intent intent=......
MyClass obje=new MyClass();
intent.putExtra("someStringHere",obje);
それを取得するには、簡単に電話してください
MyClass objec=(MyClass)intent.getExtra("theString");
Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);
startACtivity(i);
とにかくモデルレイヤーへのゲートウェイとして機能するシングルトンクラス(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;
}
このソリューションでは、問題のオブジェクトのシリアル化やその他の「パッケージ化」は必要ありません。しかし、とにかくこの種のアーキテクチャを使用している場合にのみ有益です。
IMHOがオブジェクトをパーセル化する最も簡単な方法。区画化するオブジェクトの上に注釈タグを追加するだけです。
ライブラリの例を以下に示します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; }
}
まず 、クラスに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");
パッケージ文字列は必要ありません。両方のアクティビティで文字列が同じである必要があります。
このアクティビティから別のアクティビティを開始し、バンドルオブジェクトを介してパラメータを渡します
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "xyz@gmail.com");
startActivity(intent);
別のアクティビティで取得(YourActivity)
String s = getIntent().getStringExtra("USER_NAME");
これは、単純な種類のデータ型では問題ありません。ただし、アクティビティの間に複雑なデータを渡したい場合は、最初にそれをシリアル化する必要があります。
ここに従業員モデルがあります
class Employee{
private String empId;
private int age;
print Double salary;
getters...
setters...
}
グーグルが提供するGsonlibを使用して、このような複雑なデータをシリアル化できます。
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);
Koltinで
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")
最も簡単でJavaの方法は、pojo/modelクラスにシリアライズ可能を実装することです。
パフォーマンスビューのAndroidに推奨:モデルを分割可能にする
putExtra機能の使用にあまりこだわらず、オブジェクトを使用して別のアクティビティを起動したい場合は、私が作成したGNLauncher(https://github.com/noxiouswinter/gnlib_android/wiki#gnlauncher)ライブラリを確認できます。このプロセスをより簡単にするため。
GNLauncherを使用すると、必要なデータをパラメーターとして使用してアクティビティ内の関数を呼び出すのと同じくらい簡単に、別のアクティビティなどからアクティビティにオブジェクト/データを送信できます。型の安全性を導入し、シリアル化、文字列キーを使用したインテントへのアタッチ、およびもう一方の端での取り消しの煩わしさをすべて取り除きます。
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");
最も簡単なのは、アイテムが文字列である場合に次を使用することです。
intent.putextra("selected_item",item)
受信用:
String name = data.getStringExtra("selected_item");
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);
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");
少し遅れていることは承知していますが、いくつかのオブジェクトに対してこれを実行したい場合は、宛先アクティビティでオブジェクトをパブリック静的オブジェクトとして宣言してみませんか?
public static myObject = new myObject();
そしてあなたのソースアクティビティからそれに値を与えるだけですか?
destinationActivity.myObject = this.myObject;
ソースアクティビティでは、他のグローバルオブジェクトと同じように使用できます。多数のオブジェクトの場合、メモリの問題が発生する可能性がありますが、少数のオブジェクトの場合、これが最善の方法だと思います。