Ответ 1
Один из способов заключается в том, чтобы ваш пользовательский объект реализовал интерфейс Parcelable и использовал Bundle.putParcelable/Bundle.getParcelable
Я пытаюсь передать свой собственный пользовательский объект в пакет:
Bundle b = new Bundle();
STMessage message = (STMessage)a.getAdapter().getItem(position);
b.putObject("message",message);
Я получаю сообщение об ошибке:
The method putObject(String, Object) is undefined for the type Bundle
Один из способов заключается в том, чтобы ваш пользовательский объект реализовал интерфейс Parcelable и использовал Bundle.putParcelable/Bundle.getParcelable
Сделайте свой пользовательский объект Parcelable или Serializable, затем используйте putParcelable или putSerializable.
В зависимости от сложности вашего объекта тот или иной может быть проще.
Класс модели
package com.sam.bundleobjectpass;
import java.io.Serializable;
/**
* Created by Samir on 31.8.2016.
*/
public class Model implements Serializable {
private String name;
private String surName;
private int age;
public Model(String name, String surName, int age) {
this.name = name;
this.surName = surName;
this.age = age;
}
public String getName() {
return name;
}
public String getSurName() {
return surName;
}
public int getAge() {
return age;
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Model model = new Model("Sam", "Sami",32);
Intent i = new Intent(MainActivity.this, ReceiverActivity.class);
i.putExtra("Editing", model); // sending our object
startActivity(i);
}
}
ReceiverActivity
public class ReceiverActivity extends Activity {
TextView txt_name;
TextView txt_surname;
TextView txt_age;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
txt_name = (TextView)findViewById(R.id.txt_name);
txt_surname = (TextView)findViewById(R.id.txt_surname);
txt_age = (TextView)findViewById(R.id.txt_age);
// receiving our object
Model model = (Model) getIntent().getSerializableExtra("Editing");
txt_name.setText(model.getName());
txt_surname.setText(model.getSurName());
txt_age.setText(""+model.getAge());
}
}
Так как использование Parsable
предназначено для высокопроизводительного IPC-транспорта, как упоминалось в некоторых комментариях, я попытался использовать другой подход.
Мой подход использует GSON в Google.
Пример
public class Person{
private String name;
private int age;
// Getter and Setters omitted
}
У вас может быть метод в классе утилиты, который возвращает экземпляр Gson, это ради чистого кода и организации. Я буду использовать GsonBuilder, чтобы кто-то зарегистрировал пользовательский адаптер.
public class Utils {
private static Gson gson;
private static Gson getGsonParser() {
if(null == gson) {
GsonBuilder builder = new GsonBuilder();
gson = builder.create();
}
return gson;
}
}
Момент истины!
PUT
Bundle args = new Bundle();
String personJsonString = Utils.getGsonParser().toJson(person);
args.putString(PERSON_KEY, personJsonString);
GET
Bundle args = getArguments();
String personJsonString = args.get(PERSON_KEY);
Person person= Utils.getGsonParser().fromJson(str, Person.class);
В настоящее время я не знаю ограничения производительности этого подхода. Но он отлично работает
Как сказал Райан. Кроме того, если вы хотите передать только один объект при мягком убийстве, рассмотрите возможность использования onRetainConfigurationInstance и getLastNonConfigurationInstance для передачи сериализуемого объекта. Все дерево объектов должно быть сериализуемым. Если вы передаете объект с помощью намерения, подумайте о повторной реорганизации объектного кода в код Parceable позже, как только архитектура стабилизируется. Наконец, рассмотрите возможность использования полного имени класса при сохранении объекта в Bundle, как в:
inPWState= (PasswordState) getIntent().getSerializableExtra("jalcomputing.confusetext.PasswordState");
Надеюсь, что это поможет. JAL