Android передает arraylist обратно к родительской активности - PullRequest
1 голос
/ 06 марта 2011

Я искал простой пример этого без удачи.

В моем приложении для 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;
}

и не в одиночку.

Большое спасибо Питеру! Надеюсь, это поможет кому-то еще.

1 Ответ

2 голосов
/ 06 марта 2011

Ваш класс MyObject должен реализовывать Parcelable, чтобы его можно было сериализовать / десериализовать в Android при помещении в Bundle.

Обновление:

Имя метода - createFromParcel. А на самом деле вы должны создать свой объект Plan из данных в посылке:

public Plan createFromParcel(Parcel in) {
        Plan plan = new Plan();
        plan.setId(in.readString());
        plan.setName(in.readString());
        return plan;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...