Я искал простой пример этого без удачи.
В моем приложении для Android у меня есть два вида деятельности:
1. Основная деятельность, которая запускается при запуске
2. Второе действие, которое запускается нажатием кнопки на главном активе.
Когда второе действие завершено (нажатием кнопки), я хочу, чтобы оно отправило обратно ArrayList типа MyObject в основное действие и закрыло себя, которое основное действие может затем сделать с ним. Как бы я пошел для достижения этого? Я пытался сделать несколько вещей, но мое приложение перестало работать, когда я запускаю второе действие.
Когда пользователь нажимает кнопку для запуска второго действия:
Intent i = new Intent(MainActivity.this, secondactivity.class);
startActivityForResult(i, 1);
Массив, который связывается после нажатия кнопки на втором действии:
Intent intent= getIntent();
Bundle b = new Bundle();
b.putParcelableArrayList("myarraylist", mylist);
intent.putExtras(b);
setResult(RESULT_OK, intent);
finish();
И, наконец, слушатель основного действия (хотя я не уверен в 100%, когда этот код запускается ...)
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK && requestCode==1){
Bundle extras = data.getExtras();
final ArrayList<MyObject> mylist = extras.getParcelableArrayList("myarraylist");
Toast.makeText(MainActivity.this, mylist.get(0).getName(), Toast.LENGTH_SHORT).show();
}
}
Есть идеи, где я иду не так? OnActivityResult (), кажется, сбой моего приложения.
РЕДАКТИРОВАТЬ: Класс с разлагаемыми методами:
import android.os.Parcel;
import android.os.Parcelable;
public class Plan implements Parcelable{
private String name;
private String id;
public Plan(){
}
public Plan createFromParcel(Parcel in) {
Plan plan = new Plan();
plan.setId(in.readString());
plan.setName(in.readString());
return plan;
}
public Plan(String name, String id){
this.name = name;
this.id = id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getId(){
return id;
}
public void setId(String id){
this.id = id;
}
public String toString(){
return "Plan ID: " + id + " Plan Name: " + name;
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(name);
}
public static final Parcelable.Creator<Plan> CREATOR
= new Parcelable.Creator<Plan>() {
public Plan createFromParcel(Parcel in) {
return new Plan();
}
@Override
public Plan[] newArray(int size) {
// TODO Auto-generated method stub
return new Plan[size];
}
};
}
После завершения второго действия вызывается onactivityresult, но внутри тоста ничего не отображается, его пробел. есть идеи? Я предполагаю, что мой класс все еще испорчен ...
РЕДАКТИРОВАТЬ: получил его на работу
У меня был метод, который Питер поставил не в том месте. Должно быть внутри создателя, вот так:
public static final Parcelable.Creator<Plan> CREATOR
= new Parcelable.Creator<Plan>() {
public Plan createFromParcel(Parcel in) {
Plan plan = new Plan();
plan.setId(in.readString());
plan.setName(in.readString());
return plan;
}
и не в одиночку.
Большое спасибо Питеру! Надеюсь, это поможет кому-то еще.