Android bundle put object

Parcelable. Передаём объекты

Очень часто программисту приходится передавать данные из одной активности в другую. Когда речь идёт о простых типах, то используется метод intent.putExtra() и ему подобные. Данный способ годится для типов String, int, long или массивов. А вот объекты таким образом передать не получится.

В Java существует специальный интерфейс Serializable, но он оказался слишком неповоротлив для мобильных устройств и пользоваться им настоятельно не рекомендуется. Для передачи объектов следует использовать другой интерфейс Parcelable.

В интерфейсе Parcelable используются два метода describeContents() и writeToParcel():

Метод describeContents() описывает различного рода специальные объекты, описывающие интерфейс.

Метод writeToParcel() упаковывает объект для передачи.

Также необходимо реализовать статическое поле Parcelable.Creator CREATOR, которое генерирует объект класса-передатчика.

Напишем пример. Попробуем передать объект «Мои документы». Как известно, признаком настоящего документа являются Усы, лапы, хвост (я ещё добавил бы имя). Создадим новый класс DocumentInfo, который реализует интерфейс Parcelable:

Теперь мы может передать объект через Intent. Создадим две активности. В первой активности напишем код для отправки объекта:

Вторая активность должна принять данные от первой активности:

Получив объект из первой активности, мы можем извлечь необходимые данные и разложить по полочкам.

Если класс слишком большой, то вручную его переделывать утомительно. Существует онлайн-сервис parcelabler а также плагин для Android Studio mcharmas/android-parcelable-intellij-plugin: IntelliJ Plugin for Android Parcelable boilerplate code generation.

Источник

[Android] Pass Object, ArrayList from Activity or Fragment to Bundle

[Android] Pass Object, ArrayList from Activity or Fragment to Bundle

This is an example of passing Object, ArrayList as a bundle.

It is also possible to pass your custom object to other activities using the Bundle class.

There are two ways:

  • Serializable interface—for Java and Android
  • Parcelable interface—memory efficient, only for Android (recommended)

When using Intent, use it as follows.

Fragment can be used as below.

Java usage examples

Kotlin usage examloes code :

Code for the (Serializable) Item class.

(Parcelable) The code for the Item2 class.

Parcelable

Parcelable processing is much faster than serializable. One of the reasons for this is that we are being explicit about the serialization process instead of using reflection to infer it. It also stands to reason that the code has been heavily optimized for this purpose.

Java code of the sending part.

Java code of the receiving part.

Results screen Wow .

You have followed the group:

[안드로이드] Activity,Fragment 에서 Bundle 로 Object, ArrayList 넘기기

Bundle 로 Object, ArrayList 넘기기 예제 입니다. Intent를 사용하실 경우에는 아래와 같이 사용하며 // 줄때 Intent intent = new Intent(); Bundle bundle…

Please add Group :

Читайте также:  Через что перепрошить андроид

Please add group

— Who does not answer questions, press delete all cases.
— Incomplete answers are also deleted.
— Accepting only people, not accepting pages
Impolite, illegal, erased and banned
— Account / Avatar account.
— No need to join a group. Catch, delete, only one location.
— Do not advertise for work Job .
— This group is sharing knowledge, not sharing nonsense.

— Thank you to member All.
— Thank you for the add later

Pm.
If you understand Please reply with If not, then you will be deleted.

I created a group of Android Developers Android and Kotlin Droidcon Github library. If you have any questions, you can ask. You can join in the App Telegram. Now join Android Developers And Kotlin Droidcon

Android Developers And Kotlin Droidcon Github Library

Источник

Как отправлять объекты через bundle

Мне нужно передать ссылку на класс, который делает большую часть моей обработки в узелке.

проблема в том, что она не имеет ничего общего с намерениями или контекстами и имеет большое количество непримитивных объектов. Как упаковать класс в parcelable / serializable и передать его в startActivityForResult ?

11 ответов

выяснение того, какой путь предпринять, требует ответа не только на ключевой вопрос CommonsWare «почему», но и на вопрос » к чему?- вы проезжаете мимо.

реальность такова, что единственное, что может пройти через пакеты, — это простые данные-все остальное основано на интерпретациях того, что эти данные означают или указывают. Вы не можете буквально передать объект, но то, что вы можете сделать, — это одна из трех вещей:

1) Вы можете разбить объект на его составляющие данные и если то, что находится на другом конце, имеет знания об одном и том же объекте, оно может собрать клон из сериализованных данных. Именно так большинство распространенных типов проходят через связки.

2) Вы можете передать непрозрачную ручку. Если вы передаете его в том же контексте (хотя можно спросить, зачем беспокоиться), это будет дескриптор, который вы можете вызвать или разыменовать. Но если вы передадите его через Binder в другой контекст, это буквальное значение будет произвольным числом (на самом деле, эти произвольные числа подсчитываются последовательно от запуска). Вы не можете ничего сделать, кроме как отслеживать его, пока вы не передадите его обратно в исходный контекст, который заставит Binder преобразовать его обратно в исходный дескриптор, что снова сделает его полезным.

3) Вы можете передать волшебный дескриптор, такой как файловый дескриптор или ссылку на определенные объекты ОС/платформы, и если вы установите правильные флаги, связующее создаст клон, указывающий на тот же ресурс для получателя, который фактически может быть использован на другом конец. Но это работает только для очень немногих типов объектов.

скорее всего, вы либо передаете свой класс, чтобы другой конец мог отслеживать его и возвращать вам позже, либо вы передаете его в контекст, где клон может быть создан из сериализованных конституентных данных. или же вы пытаетесь сделать что-то, что просто не сработает, и вам нужно переосмыслить весь подход.

Читайте также:  Mope io для андроид

вы также можете использовать Gson для преобразования объекта в JSONObject и передачи его в bundle. Для меня это был самый элегантный способ сделать это. Я не проверял как это влияет на производительность.

В Начальной Деятельности

В Следующем Действии

на Parcelable интерфейс-хороший способ передать объект с намерением.

как я могу сделать мои пользовательские объекты Parcelable? очень хороший ответ о том, как использовать Parcelable

чиновник документы google также включают пример

вы можете использовать global приложение государство.

настроить, а затем добавить это в свой AndroidManifest.XML-код :

а затем иметь класс в вашем проекте, как это:

надеюсь, что это поможет.

вы также можете сделать ваши объекты сериализуемые и используйте getSerializable и putSerializable методы.

Источник

Bundle in Android with Example

It is known that Intents are used in Android to pass to the data from one activity to another. But there is one another way, that can be used to pass the data from one activity to another in a better way and less code space ie by using Bundles in Android. Android Bundles are generally used for passing data from one activity to another. Basically here concept of key-value pair is used where the data that one wants to pass is the value of the map, which can be later retrieved by using the key. Bundles are used with intent and values are sent and retrieved in the same fashion, as it is done in the case of Intent. It depends on the user what type of values the user wants to pass, but bundles can hold all types of values (int, String, boolean, char) and pass them to the new activity.

The following are the major types that are passed/retrieved to/from a Bundle:

putInt(String key, int value), getInt(String key, int value)

putString(String key, String value), getString(String key, String value)

putStringArray(String key, String[] value), getStringArray(String key, String[] value)

putChar(String key, char value), getChar(String key, char value)

putBoolean(String key, boolean value), getBoolean(String key, boolean value)

Using the Bundle in the Android App

The bundle is always used with Intent in Android. Now to use Bundle writes the below code in the MainActivity.

Источник

Полный список

— добавляем объекту поддержку Parcelable
— передаем с помощью Intent

С Parcel мы немного поработали на прошлом уроке. Этих знаний хватит, чтобы понять, как реализовать в своем объекте интерфейс Parcelable. Создадим свой объект, реализуем в нем интерфейс Parcelable и попробуем передать в другое Activity через Intent.

Project name: P0691_Parcelable
Build Target: Android 2.3.3
Application name: Parcelable
Package name: ru.startandroid.develop.p0691parcelable
Create Activity: MainActivity

В strings.xml пропишем тексты:

В main.xml нарисуем кнопку:

Перед тем как кодить MainActivity.java, создадим свой объект для передачи MyObject.java:

Объект сам по себе несложный: пара переменных s и i, и конструктор. Все остальное используется для реализации Parcelable. Давайте смотреть.

Про метод describeContents ничего сказать не могу. Я не понял, зачем он нужен.

Читайте также:  Что такое телеприставка андроид

В методе writeToParcel мы получаем на вход Parcel и упаковываем в него наш объект. Т.е., в нашем случае, помещаем туда переменные s и i. flags не используем.

CREATOR типа Parcelable.Creator используется для создания экземпляра нашего MyObject и заполнения его данными из Parcel.

Для этого используется его метод createFromParcel, который мы должны реализовать. На вход нам дается Parcel, а вернуть мы должны готовый MyObject. В нашем примере мы используем здесь конструктор MyObject(Parcel parcel), который реализован чуть дальше.

Смысл метода newArray остался для меня непонятен.

Конструктор MyObject(Parcel parcel) принимает на вход Parcel и заполняет объект данными из него. Этот метод использовался нами чуть ранее в CREATOR.createFromParcel.

Создадим второе Activity, в которое будем передавать объект.

Сначала создаем экран second.xml:

Мы вытаскиваем наш MyObject-объект из Intent и в лог выводим значения s и i.

Создаем Intent, помещаем туда объект MyObject. В качестве ключа используем его имя класса (разумеется, это необязательно, вы можете свое имя использовать). И отправляем Intent с вызовом SecondActivity.

Все сохраним и запустим приложение.

Жмем Send, Intent уходит в SecondActivity

MyObject(String _s, int _i)
startActivity
writeToParcel
getParcelableExtra
createFromParcel
MyObject(Parcel parcel)
myObj: text, 1

Сначала вызвался конструктор MyObject(String _s, int _i) – это мы создали myObj.

startActivity – начинаем вызов Activity

writeToParcel — мы поместили объект в Intent, и похоже, что при отправке он упаковался в Parcel. Т.к. сам Parcel не знает, как именно упаковать объект, он вызвал метод writeToParcel, где мы реализовали упаковку.

getParcelableExtra – извлекаем объект из Intent

createFromParcel – это был вызван метод CREATOR.createFromParcel, которому на вход дали Parcel, а он должен вернуть MyObject. Этот метод в свою очередь для создания MyObject использует конструктор MyObject(Parcel parcel), в котором мы расписали, как надо читать Parcel и заполнить объект.

myObj: text, 1 – вывели в лог значения объекта.

Итак. Чтобы нам передать объект через Intent, нам надо реализовать в нем интерфейс Parcelable. В этом случае Intent без проблем запакует, передаст и распакует наш объект. И я так подозреваю, что делает он это с помощью Parcel. Т.е. в реализации интерфейса Parcelable мы полностью описываем алгоритм упаковки и распаковки объекта, а Parcel эти алгоритмы потом использует. Т.к. сам он не может знать, как правильно распаковать и создать передаваемый объект.

Если кто разберется, зачем нужны непонятые мною методы – пишите на форуме в ветке этого урока. Я добавлю вашу инфу в урок.

На следующем уроке:

— сохраняем данные при повороте экрана

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Оцените статью