Как отправить объект из одной операции Android в другую, используя Intents? - PullRequest
810 голосов
/ 26 января 2010

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

Ответы [ 35 ]

14 голосов
/ 26 июня 2013

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

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

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

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

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

Е. Передача данных через интерфейс Intents и Parcelable.

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

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

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

Учебники - http://www.vogella.com/articles/AndroidSQLite/article.html

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

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

Как хранить

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

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

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

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

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

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

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


}

Установите переменную в вашем почтовом методе, используя

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

Затем используйте сериализацию объекта для сериализации этого объекта, а в другом классе десериализуйте этот объект.

При сериализации объект может быть представлен в виде последовательности байтов, которая включает в себя данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объекте.

После записи в файл сериализованного объекта его можно прочитать из файла и десериализовать, то есть информацию о типе и байты, представляющие объект и его данные, можно использовать для воссоздания объекта в памяти. *

Если вы хотите учебник для этого, обратитесь по этой ссылке

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

Получить переменную в других классах

D. CommonUtilities

Вы можете самостоятельно создать класс, который может содержать общие данные, которые вам часто нужны в вашем проекте.

Sample

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/

13 голосов
/ 26 февраля 2016

Я использую Gson с таким мощным и простым API для отправки объектов между действиями,

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

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

Отправить объект из А в 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);
}

Я использую его почти в каждом проекте, и у меня нет проблем с производительностью.

9 голосов
/ 11 сентября 2012

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

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

9 голосов
/ 19 октября 2013

В вашем первом занятии:

intent.putExtra("myTag", yourObject);

А во втором:

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

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

public class myCustomObject implements Serializable {
...
}
7 голосов
/ 19 декабря 2012

Другой способ сделать это - использовать объект 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.

6 голосов
/ 09 января 2016
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 голосов
/ 26 августа 2015

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

удачи !!

5 голосов
/ 10 февраля 2010

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

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

активность A

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

активность b

mytestclass obj= mytestclass.staticfunctionGet();
4 голосов
/ 06 октября 2011

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

4 голосов
/ 27 ноября 2013

Создание приложения для 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());

}
}
...