это - переход между страницами android studio




Как отправить объект из одной активности Android в другой с помощью намерений? (20)

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


В первом упражнении:

intent.putExtra("myTag", yourObject);

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

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

Не забудьте сделать свой пользовательский объект Serializable:

public class myCustomObject implements Serializable {
...
}

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

Here что сказал по этому поводу Dianne Hackborn (hackbod - разработчик программного обеспечения Google Android):

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

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

Надеюсь, это поможет: D


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

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


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


Если вы просто проходите объекты вокруг, то 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 это просто вопрос помещения их в свои putExtra() с помощью 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);

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

}
}

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

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

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

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


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

public class MyClass implements Serializable{

}

то вы можете перейти к

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

Чтобы получить его, вы просто позвоните

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

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

удачи!!


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


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

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

int во втором действии вы можете получить данные, подобные этому

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

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


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

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

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

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

активность b

mytestclass obj= mytestclass.staticfunctionGet();

Запустите другое действие из этих параметров прохода активности через объект 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);

Используя библиотеку Gson Google, вы можете передать объект другим действиям. Фактически мы будем преобразовывать объект в форме строки 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);

Добавьте эту зависимость в градус

compile 'com.google.code.gson:gson:2.6.2'

POJO class «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);

        }
    });

В классе получателей «Комментарии» вы можете получить данные следующим образом:

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

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

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


Сначала реализуйте 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");

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

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


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




android-activity