it-swarm.com.ru

Как отправить объект из одного Android Activity в другой, используя Intents?

Как я могу передать объект пользовательского типа из одного Activity в другой, используя метод putExtra() класса Intent ?

787
UMAR

самое простое решение, которое я нашел, это .. создать класс со статическими членами данных с помощью методов установки геттеров.

установить из одного действия и получить из другого действия этот объект.

деятельность А

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

деятельность б

mytestclass obj= mytestclass.staticfunctionGet();
5
UMAR

Если вы просто передаете объекты, то Parcelable был разработан для этого. Это требует чуть больше усилий, чем использование собственной сериализации Java, но это намного быстрее (и я имею в виду, WAY быстрее).

Из документации простой пример того, как реализовать:

// 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);
711
Jeremy Logan

Вам нужно будет сериализовать ваш объект в какое-то строковое представление. Одним из возможных строковых представлений является JSON, и один из самых простых способов сериализации в/из JSON в Android, если вы спросите меня, - через Google GSON .

В этом случае вы просто помещаете строковое возвращаемое значение из (new Gson()).toJson(myObject); и извлекаете строковое значение и используете fromJson, чтобы превратить его обратно в ваш объект.

Однако, если ваш объект не очень сложен, это может не стоить дополнительных затрат, и вы можете вместо этого передать отдельные значения объекта.

174
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

Если вы знаете, что будете передавать данные в приложении, используйте «глобальные переменные» (например, статические классы).

Здесь это то, что Дайана Хэкборн (hackbod - инженер по программному обеспечению Google Android) должна была сказать по этому вопросу:

Для ситуаций, когда вы знаете, что действия выполняются в одном и том же процесс, вы можете просто обмениваться данными через глобальные. Например, вы может иметь глобальный HashMap<String, WeakReference<MyInterpreterState>> и когда вы делаете новый MyInterpreterState, придумайте уникальное имя для этого и поместите это в хэш-карту; отправить это состояние в другое активность, просто введите уникальное имя в хэш-карту и когда второе действие запущено, он может получить MyInterpreterState из хэш-карта с именем, которое он получает.

64
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

45
Pedro Romão

Короткий ответ для быстрой необходимости 

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

если ваш объектный класс реализуетSerializable, вам больше ничего не нужно делать, вы можете передать сериализуемый объект. 
это то, что я использую.

27
Vlad

Вы можете использовать Android 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");
}

Объявите это в своем пользовательском классе и используйте.

16
om252345

реализовать сериализуемый в вашем классе

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

во втором упражнении вы можете получить такие данные

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

Но когда данные станут большими, этот метод будет медленным.

16
Ishan Fernando

Спасибо за посылочную помощь, но я нашел еще одно дополнительное решение 

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

Есть несколько способов получить доступ к переменным или объектам в других классах или Activity.

А. База данных 

Б. общие предпочтения.

C. Сериализация объектов.

D. Класс, который может содержать общие данные, может называться Common Utilities, это зависит от вас.

E. Передача данных через Intents и Parcelable Interface.

Это зависит от потребностей вашего проекта.

A. База данных

SQLite - это база данных с открытым исходным кодом, встроенная в Android. SQLite поддерживает стандартные функции реляционной базы данных, такие как синтаксис SQL, транзакции и подготовленные операторы. 

Учебные руководства - http://www.vogella.com/articles/AndroidSQLite/article.html

B. Общие настройки

Предположим, вы хотите сохранить имя пользователя. Так что теперь будет две вещи: имя пользователя Key, значение Value.

Как хранить

 // 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 () вы можете сохранить желаемый тип данных.

Как получить

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

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

C. Сериализация объектов

Объектная серизация используется, если мы хотим сохранить состояние объекта, чтобы отправить его по сети, или вы можете использовать его для своих целей.

Используйте Java-бины и сохраняйте их как одно из его полей и используйте для этого методы getter и setter

JavaBeans - это классы Java, которые имеют свойства. Думайте о properties как частные переменные экземпляра. Поскольку они закрыты, единственный способ Получить к ним доступ из-за пределов своего класса - через методы в классе. Методы , Которые изменяют значение свойства, называются методами установки, а методы , Которые получают значение свойства, называются методами получения. 

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 функции вы добавляете их к объектам, которые вы хотите отправить

Использование

Отправить объект из А в Б

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

И в твоем втором:

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

Не забудьте сделать свой пользовательский объект Сериализуемым: 

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

Я боролся с той же проблемой. Я решил это с помощью статического класса, храня любые данные, которые я хочу в HashMap. Сверху я использую расширение стандартного класса Activity, где я переопределил методы onCreate и onDestroy, чтобы сделать скрытую передачу данных и очистку данных. Некоторые нелепые настройки должны быть изменены, например, Ориентация обработки.

Аннотация: Отсутствие общих объектов для передачи другому. Деятельность - боль в заднице. Это все равно что выстрелить себе в колено и надеяться выиграть 100 метров. «Parcable» не является достаточной заменой. Это заставляет меня смеяться ... Я не хочу внедрять этот интерфейс в мой технологичный API, так как меньше я хочу представить новый уровень ... Как могло случиться, что мы находимся в мобильном программировании так далеко от современная парадигма ...

9
oopexpert

Еще один способ сделать это - использовать объект 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.

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
Adnan Abdollah Zaki

в вашей модели класса (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");

удачи!!

6
David Hackro

Создать приложение для 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 + "]";
    }   
}

Два макета для двух занятий

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

}
}
4
MFP

вы можете использовать методы putExtra (Serializable ..) и getSerializableExtra () для передачи и получения объектов вашего типа; вам нужно пометить ваш класс Serializable и убедиться, что все ваши переменные-члены тоже сериализуемы ... 

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

Я знаю, что уже поздно, но это очень просто. Все, что вам нужно сделать, это позволить вашему классу реализовать Serializable, как

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, а после перехода к другому действию мы снова будем преобразовывать объект таким образом.

Рассмотрим класс бобов, подобный этому

 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 Object

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

Строка пакета не обязательна, просто строка должна быть одинаковой в обеих операциях 

ССЫЛКА

2
Arpit Patel

Если вы не очень заинтересованы в использовании функции putExtra и просто хотите запустить другое действие с объектами, вы можете проверить библиотеку GNLauncher ( https://github.com/noxiouswinter/gnlib_Android/wiki#gnlauncher ) I написал в попытке сделать этот процесс более прямым.

GNLauncher делает отправку объектов/данных в Activity из другого Activity и так же просто, как вызов функции в Activity с необходимыми данными в качестве параметров. Он вводит безопасность типов и устраняет все трудности, связанные с сериализацией, присоединением к цели с использованием строковых ключей и отменой того же на другом конце.

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

В Колтине

Добавьте расширение kotlin в ваш build.gradle.

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

Класс 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