Урок 69. Передаем Parcelable объекты с помощью Intent

Обсуждение уроков
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 69. Передаем Parcelable объекты с помощью Intent

Сообщение Mikhail_dev » 27 дек 2013, 10:47

Скрин вырви глаз какой-то. Не объявляйте метод onClick в XML файле, делайте это исключительно через код.

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 69. Передаем Parcelable объекты с помощью Intent

Сообщение brucemax » 27 дек 2013, 13:00

Скрин реально доставляет))
а ошибка может быть из-за того, что, выражаяcь понятным языком, метод клика не найдет (или его вообще нет или сигнатура не совпала (должно быть:

Код: Выделить всё

public void <название из xml>(View v)
))
Поэтому, как сказали выше, лучше через xml этого не делать )

September
Сообщения: 5
Зарегистрирован: 07 фев 2014, 19:02

Re: Урок 69. Передаем Parcelable объекты с помощью Intent

Сообщение September » 09 апр 2014, 14:54

Есть вопрос по поводу parcel.readMap какая карта нужна в параметрах, или вообще что нужно там указывать
public final void readMap (Map outVal, ClassLoader loader)

у меня:

private ParsResult(Parcel parcel)
{
resultMap = parcel.readMap(,getClass().getClassLoader());
}

P.S Мб есть другой способ передать карту вида Map<<Мой класс>, List<Мой класс>>; другому Activity?
P.P.S Вопрос решил, использованием интерфейса сериализации.

Dmitry_K
Сообщения: 3
Зарегистрирован: 13 ноя 2013, 22:12

Re: Урок 69. Ошибка

Сообщение Dmitry_K » 21 июн 2014, 14:01

Superoleg писал(а):все вроде бы стартует, а при попытке нажать на кнопку выдает такую ошибку
У меня была такая же ошибка пока я SecondActivity не прописал в AndroidManifest файле.

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 69. Передаем Parcelable объекты с помощью Intent

Сообщение Sebler » 21 июн 2014, 22:33

Всем привет. У меня следующая ситуация. Есть объект с полями
private ArrayList<Map<String, Object>> groupData;
private ArrayList<ArrayList<Map<String, Object>>> childData;
private ArrayList<List<LatLng>> polylinePoints;
private ArrayList<Map<String, Double>> mapBounds;

пытался сделать его Parcelable, но что-то никак не разберусь что тут к чему. То ли writeTypedList() и readTypedList() надо использовать, то ли просто writeList() и readList()? И какие параметры нужно подставлять в каждом случае. У Map<String, Object> в качестве объектов встречаются строки, Integer-ы и ArrayList-ы, никаких собственных классов. Кто нибудь может просветить?

P.S. пытался вместо Parcelable использовать Serializable. Тут получается скомпилировать код, но при старте второй активити, в которую требуется передать объект, eclipse выдаёт java.lang.RuntimeException: Parcelable encountered IOException writing serializable object

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 69. Передаем Parcelable объекты с помощью Intent

Сообщение Sebler » 21 июн 2014, 22:45

Похоже, что не сериализуется мой класс, потому что он содержит AsyncTask в качестве внутреннего класса. Но вопрос по Parcelable по-прежнему открыт.

Otto
Сообщения: 1
Зарегистрирован: 06 фев 2015, 17:03

Re: Урок 69. Передаем Parcelable объекты с помощью Intent

Сообщение Otto » 06 фев 2015, 17:32

Parcellable быстрее, чем Serializable. Пруфлинк: http://habrahabr.ru/post/174015/
Если у тебя парочка простых параметров, то intent.putExtra() - самое оно. Но когда нужно передавать большие объемы данных между Activity или объекты между фрагментами - Parcellable будет самым оптимальным, имхо. Итак, разница:
  • 1. интерфейс Serializable - удобно, "java-styled", но медленно;
    2. интерфейс Parcellable - "android-specific", менее удобно, зато резво
.

Где применять:
  • 1. intent.putExtra() - при передаче нескольких параметров;
    2. Serializable - при передаче НЕбольших объектов/при передаче МАЛОГО количества объектов;
    3. Parcellable - при передаче больших объектов/при передаче БОЛЬШОГО количества объектов + <имхо> при "общении" фрагментов и основной активити</имхо>;

Аватара пользователя
Kirill
Сообщения: 19
Зарегистрирован: 09 сен 2015, 13:53

Re: Урок 69. Передаем Parcelable объекты с помощью Intent

Сообщение Kirill » 11 сен 2015, 01:25

Спасибо з урок. Обсуждение на форуме очень помогло в усвоении информации.
Очевидно, что львиная доля полезности в обсуждении идет от опытных "обитателей" за что им большое спасибо.

Пожелание к уроку/урокам: отдельно уделять время реальным примерам и практике использования тех технологий, которые разбираются в конкретном уроке.
Например - тема интерфейс Parcelable - сразу же объяснить зачем и когда он используется. Какие есть аналоги и когда они используются (например отличие от Serializable, или почему данные нельзя просто передавать как putExtra или в Preferences или в БД или в файлик или как значения статических полей и т.д.)

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 69. Передаем Parcelable объекты с помощью Intent

Сообщение doter.ua » 11 сен 2015, 11:50

JSON + Gson lib: MyObject -> json, json -> MyObject
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Foxy
Сообщения: 13
Зарегистрирован: 15 дек 2016, 14:57
Откуда: Volgograd
Контактная информация:

Re: Урок 69. Передаем Parcelable объекты с помощью Intent

Сообщение Foxy » 12 янв 2017, 13:32

Код: Выделить всё

public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() {
    // распаковываем объект из Parcel
    public MyObject createFromParcel(Parcel in) {
      Log.d(LOG_TAG, "createFromParcel");
      return new MyObject(in);
    }
Ребятки, у меня вот тут почему-то ругается.. Говорит:
Изображение

Я что-то вообще не понимаю, что он от меня хочет.. Подскажете?

Писал сначала руками всё, как всегда - подумал, что где-то мой косяк. Второй раз скопипастил - нет, дело в чем-то другом.

Аватара пользователя
Foxy
Сообщения: 13
Зарегистрирован: 15 дек 2016, 14:57
Откуда: Volgograd
Контактная информация:

Re: Урок 69. Передаем Parcelable объекты с помощью Intent

Сообщение Foxy » 12 янв 2017, 13:35

Так, разобрался.. Дописал конструктор, считывающий из Parcel:

Код: Выделить всё

private MyObject(Parcel parcel) {
    Log.d(LOG_TAG, "MyObject(Parcel parcel)");
    s = parcel.readString();
    i = parcel.readInt();
  }
Только все равно не понял, на что именно ругалась та ошибка, можно всё равно объяснений, пожалуйста?

Lolamore
Сообщения: 1
Зарегистрирован: 15 ноя 2017, 16:32

Re: Урок 69. Передаем Parcelable объекты с помощью Intent

Сообщение Lolamore » 02 апр 2018, 17:09

Помогите с передачей данных... не могу найти решения.
Это задание перекликается с темой про Adapter.
У меня есть список Product где я описываю name и price, и имплементирую Parcelable.

1 Вопрос Как передать объект по выбранному элементу при нажатии кнопки?
В Mainactivity создаю список товаров (тут будет длинейший список из бананов и мартышек)

В Base Adapter передаю name,price и кнопку (с обработчиком), при нажатии которой товар добавляется в корзину.
Base Adapter выглядит следующим образом:
//пункт списка
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {view = Inflater.inflate(R.layout.item, parent, false);
}
Product p = getProduct(position);
//Заполняем View
((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + " рублей");
//Находим кнопку и присваиваем ей обработчик
Button btn_cart = (Button) view.findViewById(R.id.cartto);
btn_cart.setOnClickListener(oMyButton);
btn_cart.setTag(String.valueOf(position));
return view;
}
//Работа кнопки
View.OnClickListener oMyButton = new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(ctx, Cart.class);
//как тут прописать значение name и price выбранного объекта, а не прописывать новый как например: Product myObj = new Product("text", 1);
Product myObj =.....
//Передаю данные в другое активити
intent.putExtra(Product.class.getCanonicalName(), myObj);
ctx.startActivity(intent);
Заранее всем спасибо! Я уже несколько дней бьюсь и не допру никак(((

Ответить