Как передать пользовательский объект в Bundle? - PullRequest
28 голосов
/ 26 апреля 2011

Я пытаюсь передать свой собственный объект в пакет:

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

Ответы [ 5 ]

42 голосов
/ 26 апреля 2011

Один из способов заключается в том, чтобы ваш пользовательский объект реализовал интерфейс Parcelable и использовал Bundle.putParcelable/Bundle.getParcelable

14 голосов
/ 31 августа 2016

Класс модели

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. In Kotlin is the same
        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());


    }
}

// Котлин

val model: ProgramModel = intent.getSerializableExtra("Editing") as ProgramModel
        model.let { // means if not null or empty
            txt_act_daily_topic.text = model.title
        }
9 голосов
/ 26 апреля 2011

Сделайте свой пользовательский объект Parcelable или Serializable затем используйте putParcelable или putSerializable.

В зависимости от сложности вашего объекта тот или иной может быть проще.

5 голосов
/ 05 октября 2017

Поскольку использование 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);

В настоящее время я не знаю ограничения производительности этого подхода. Но это работает просто отлично

0 голосов
/ 26 апреля 2011

Как сказал Райан.Также, если вы хотите передать только один объект при мягком уничтожении, рассмотрите возможность использования onRetainConfigurationInstance и getLastNonConfigurationInstance для передачи сериализуемого объекта.Все дерево объектов должно быть сериализуемым.Если вы передаете объект через намерение, рассмотрите возможность рефакторинга объектного кода в код Parceable позже, когда архитектура стабилизируется.Наконец, рассмотрите возможность использования полного имени класса при сохранении объекта в Bundle следующим образом:

inPWState= (PasswordState) getIntent().getSerializableExtra("jalcomputing.confusetext.PasswordState");

Надеюсь, это поможет.JAL

...