Как я могу передать объект пользовательского типа из одного Activity в другой, используя метод putExtra()
класса Intent?
Как отправить объект из одной активности Android в другой с помощью намерений?
Ответ 1
Самое легкое решение, которое я нашел, это.. для создания класса со статическими элементами данных с сеттерами getters.
установить из одного действия и получить от другого действия этот объект.
активность A
mytestclass.staticfunctionSet("","",""..etc.);
активность b
mytestclass obj= mytestclass.staticfunctionGet();
Ответ 2
Если вы просто передаете объекты, 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 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 values
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
Обратите внимание, что в случае, если у вас есть более одного поля для извлечения из данной Посылки, вы должны делать это в том же порядке, в котором вы их поместили (то есть в подходе FIFO).
Как только ваши объекты реализуют Parcelable
нужно просто поместить их в ваши Intents с помощью 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);
Ответ 3
Вам нужно будет сериализовать ваш объект в какое-то строковое представление. Одним из возможных строковых представлений является JSON, и одним из самых простых способов сериализации в/из JSON в Android, если вы спросите меня, является Google GSON.
В этом случае вы просто помещаете строковое возвращаемое значение из (new Gson()).toJson(myObject);
и получить строковое значение и использовать fromJson
чтобы превратить его обратно в ваш объект.
Однако, если ваш объект не очень сложен, это может не стоить дополнительных затрат, и вы можете вместо этого передать отдельные значения объекта.
Ответ 4
Вы можете отправить сериализуемый объект с помощью намерения
// 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 {
}
Ответ 5
В ситуациях, когда вы знаете, что будете передавать данные в приложении, используйте "globals" (например, статические классы)
Здесь есть Dianne Hackborn (hackbod - a Google Android Software Engineer) должен был сказать по этому поводу:
В ситуациях, когда вы знаете, что действия работают в одном и том же процесс, вы можете просто делиться данными через глобальные переменные. Например, вы может иметь глобальный
HashMap<String, WeakReference<MyInterpreterState>>
и когда вы создаете новый MyInterpreterState, вы получите уникальное имя для него и поместить его в хэш-карту; отправить это состояние другому активности, просто поместите уникальное имя в хэш-карту и когда запускается второе действие, он может извлекать MyInterpreterState из хэш-карту с именем, которое она получает.
Ответ 6
Ваш класс должен реализовывать 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 use next
MY_CLASS class = (MY_CLASS) intent.getExtras().getParcelable("KEY");
Надеюсь, это поможет: D
Ответ 7
Короткий ответ для быстрой необходимости
1. Реализуйте свой класс для сериализации.
Если у вас есть внутренние классы, не забудьте также реализовать их в 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");
Ответ 8
если ваш класс объекта реализует Serializable
, вам не нужно ничего делать, вы можете передать сериализуемый объект. Что я использую.
Ответ 9
реализовать сериализуемый в вашем классе
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);
во втором упражнении вы можете получить такие данные
Place place= (Place) getIntent().getSerializableExtra("PLACE");
Но когда данные станут большими, этот метод будет медленным.
Ответ 10
Вы можете использовать android BUNDLE для этого.
Создайте Bundle из вашего класса, например:
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");
}
Объявите это в своем пользовательском классе и используйте.
Ответ 11
Спасибо за детальную помощь, но я нашел еще одно необязательное решение
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;
}
}
В первом действии
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());
}
Ответ 12
Существует несколько способов доступа к переменным или объектам в других классах или в Activity.
а. База данных
В. общие предпочтения.
С. Сериализация объектов.
Д. Класс, который может содержать общие данные, может быть назван как Common Utilities, он зависит от вас.
Е. Передача данных через Intents и Parcelable Interface.
Это зависит от ваших потребностей проекта.
а. База данных
SQLite - это база данных с открытым исходным кодом, встроенная в Android. SQLite поддерживает стандартные функции реляционных баз данных, такие как синтаксис SQL, транзакции и подготовленные операторы.
Учебники - http://www.vogella.com/articles/AndroidSQLite/article.html
В. Общие настройки
Предположим, вы хотите сохранить имя пользователя. Итак, теперь будет два элемента: Key Username, Значение.
Как сохранить
// 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
С. Сериализация объектов
Serlization объекта используется, если мы хотим сохранить состояние объекта, чтобы отправить его по сети, или вы также можете использовать его для своей цели.
Используйте java beans и сохраните в нем как одно из своих полей и используйте для этого геттеры и сеттеры
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
Получить переменную в других классах
Д. CommonUtilities
Вы можете создать класс по себе, который может содержать общие данные, которые вам часто нужны в вашем проекте.
Пример
public class CommonUtilities {
public static String className = "CommonUtilities";
}
Е. Передача данных с помощью намерений
Пожалуйста, обратитесь к этому руководству для этой опции передачи данных.
Ответ 13
Я использую 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);
}
Я использую его почти в каждом проекте, который я делаю, и у меня нет проблем с производительностью.
Ответ 14
Я боролся с той же проблемой. Я решил это, используя статический класс, сохраняя любые данные, которые я хочу в HashMap. В верхней части я использую расширение стандартного класса Activity, в котором я переопределял методы onCreate onDestroy для скрытия переноса данных и очистки данных. Некоторые смешные настройки должны быть изменены, например. ориентация обработка.
Аннотация: Не предоставление общих объектов, которые должны быть переданы другому Управлению, - это боль в заднице. Ему нравится стрелять в колено и надеяться выиграть 100 метров. "Parcable" не является достаточной заменой. Это заставляет меня смеяться... Я не хочу реализовывать этот интерфейс для моего беспроблемного API, так как меньше я хочу представить новый слой... Как это может быть, что мы находимся в мобильном программировании так далеко от современная парадигма...
Ответ 15
В первом упражнении:
intent.putExtra("myTag", yourObject);
И во втором:
myCustomObject myObject = (myCustomObject) getIntent().getSerializableExtra("myTag");
Не забудьте сделать свой пользовательский объект Serializable:
public class myCustomObject implements Serializable {
...
}
Ответ 16
Другой способ сделать это - использовать объект 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
. Я не знаю, подходят ли они вам. Другой способ, которым я использовал это, состоит в том, чтобы иметь идентификаторы int
объектов, отправляемых через намерения, и извлекать объекты, которые у меня есть в Картах в объекте Application
.
Ответ 17
в вашей модели класса (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);
и ваше второе действие (NewActivity)
MensajesProveedor mensajes = (MensajesProveedor)getIntent().getExtras().getSerializable("mensajes");
удачи!!
Ответ 18
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");
Ответ 19
вы можете использовать методы putExtra (Serializable..) и getSerializableExtra() для передачи и извлечения объектов вашего типа класса; вам нужно будет пометить свой класс Serializable и убедиться, что все ваши переменные-члены также сериализуемы...
Ответ 20
Создать приложение для Android
Файл → Новое → Приложение для Android
Введите имя проекта: android-pass-object-to-activity
Pakcage: com.hmkcode.android
Сохраняйте другие параметры defualt, идите Далее, пока не достигнете Finish
Прежде чем приступать к созданию приложения, нам необходимо создать класс POJO "Человек", который мы будем использовать для отправки объекта из одной активности в другую. Обратите внимание, что класс реализует интерфейс 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 + "]";
}
}
Два макета для двух видов деятельности
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>
Два класса активности
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());
}
}
Ответ 21
Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);
startACtivity(i);
Ответ 22
Я знаю, что это поздно, но это очень просто. Все, что у вас есть, это позволить вашему классу реализовать Serializable, например
public class MyClass implements Serializable{
}
то вы можете перейти к такому намерению, как
Intent intent=......
MyClass obje=new MyClass();
intent.putExtra("someStringHere",obje);
Чтобы получить его, вы просто говорите
MyClass objec=(MyClass)intent.getExtra("theString");
Ответ 23
Используя библиотеку 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'
Ответ 24
Простейшим было бы просто использовать следующее, где элемент является строкой:
intent.putextra("selected_item",item)
Для получения:
String name = data.getStringExtra("selected_item");
Ответ 25
Если в любом случае у вас есть одноэлементный класс (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;
}
Это решение не требует сериализации или другой "упаковки" рассматриваемого объекта. Но это будет полезно только в том случае, если вы используете такую архитектуру.
Ответ 26
Самым простым способом является ИМХО для посылки объектов. Вы просто добавляете тег аннотации над объектом, который хотите сделать возможным.
Пример из библиотеки ниже 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; }
}
Ответ 27
Сначала реализуйте 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");
Строка пакета необязательна, только строка должна быть одинаковой в обеих видах деятельности
Ответ 28
Запустите другое действие из этих параметров прохода активности через объект 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...
}
Вы можете использовать Gson lib, предоставляемый google для сериализации сложных данных как это
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);
Ответ 29
Если вы не очень разбираетесь в использовании функции putExtra и просто хотите запустить другое действие с объектами, вы можете проверить GNLauncher (https://github.com/noxiouswinter/gnlib_android/wiki#gnlauncher), которую я написал в попытке сделать этот процесс более прямым.
GNLauncher делает отправку объектов/данных в Activity из другого Activity и так проще, как вызов функции в Activity с требуемыми данными в качестве параметров. Он вводит безопасность типов и устраняет все проблемы, связанные с сериализацией, присоединением к намерению с использованием строковых клавиш и отменой их на другом конце.
Ответ 30
Класс POJO "Опубликовать" (обратите внимание, что он реализован 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 "Комментарий" (Поскольку он является членом класса 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);
}
});
В классе получателя "Комментарии" вы можете получить следующие данные
Post post =(Post)getIntent().getSerializableExtra("post");