1

Тема: Надсилання даних з Activity до Fragment

Намагаюся надіслати дані з Activity до Fragment використовуючи BroadcastReceiver, але безрезультатно. В мережі є багато інформації про те як зробити це, створюючи новий екземпляр Fragment, але мені це не підходить бо мені потрібно оновити тільки частину UI Fragment.
Роблю це так:
У Fragment, методі onCreate():

protected DataReceiver dataReceiver;
public static final String RECDATA = "RECDATA";

@Override
public void onCreate(Bundle savedInstanceState) {


    dataReceiver = new DataReceiver();
    intentFilter = new IntentFilter(RECDATA);

    getActivity().registerReceiver(dataReceiver, intentFilter);
}

private class DataReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        int data= intent.getIntExtra("data", -1);

        // щось роблю з UI
    }
}

В Activity

Intent retIntent = new Intent(REDATA);
retIntent.putExtra("data", myData);
sendBroadcast(retIntent);

Якщо хтось бачить помилку, або може має ідею як це зробити іншим шляхом - тицніть носом де про це можна прочитати..

2 Востаннє редагувалося PRY (19.05.2018 14:48:21)

Re: Надсилання даних з Activity до Fragment

Було б зручніше, якби побачити весь текст - включно з AndroidManifest.xml.
Якщо є можливість,- зручніше на GitHub.
Використовував BroadcastReceiver для прийому повідомлень з іншого app. В цьому випадку працює нормально.

3 Востаннє редагувалося PRY (23.05.2018 15:45:04)

Re: Надсилання даних з Activity до Fragment

Можу запропонувати інший спосіб, який узгоджується з вимогами до архітектури Андроід-додатків . Простий приклад можна клонувати або стягнути .zip архів тут:
https://github.com/MikhalUkr/Sharing_da … d_Fragment
Для цієї мети використовується спільний для обох - Activity та Fragment, ViewModel з LiveData -один з архітектурних компонентів, презентованих Google на I/O 2017.
Спосіб доволі простий і прозорий. Організовується легко як одно, так і багатостороння передача інформації як між Activity та Fragment, так і між самими Fragments в рамках цього Activity.

Подякували: andriesko1

4 Востаннє редагувалося PRY (04.06.2018 22:14:14)

Re: Надсилання даних з Activity до Fragment

ViewModel призначений для розмежування UI і даних, тому, враховуючи тривалий життєвий цикл (lifecycle) цього компонента, він зокрема може використовуватись для запобігання скидання на початкові значення даних в Activity чи Fragment при обертанні телефона.
В даному прикладі я дещо змінив. Виніс лічильник в ViewData, додав кілька методів для збереження і відновлення значення лічильника. Тепер при обертання телефона і натисненні на кнопку лічильник нарощує значення, а не скидається в початкове.

Подякували: andriesko1

5 Востаннє редагувалося andriesko (06.06.2018 20:00:28)

Re: Надсилання даних з Activity до Fragment

Дуже Вам дякую, Ви відкрили для мене нове поняття і оскільки я в програмуванні під android "свіжак"=) то це спонукало мене почати детальніше з цим розбиратись. Щоправда ще поки не реалізовував це в своїй програмі, але розумію що "вбиваю двох зайців" бо планував з'єднуватись з, так би мовити, сервером до якого під'єднано декілька інших пристроїв котрі "розмовлятимуть" з ним і дані про стан цих пристроїв відображатимуться на різних вкладках у аплікації, тож при переході на іншу вкладку, а через якийсь час назад  LiveData видасть мені остатній актуальний стан ци пристроїв *THUMBSUP* . Може описав я це все троха кучеряво, але Ви реально тицьнули носом куди треба, дякую!

Ще прохання, підскажіть якусь гарну літературу..

Подякували: PRY1

6

Re: Надсилання даних з Activity до Fragment

В плані утримання (hold) даних для UI і оповіщення UI при зміні цих даних ViewModel і LiveData працюють у тісній зв'язці.
    Ви абсолютно правильно вловили суть використання LiveData. Це observable об'єкт (як, наприклад, в RxJava), що дозволяє обсерверу (в даному випадку UI компоненті) підписатись на дані, що їх LiveData буде "постачати" шляхом виклику методу onChanged(...). Дані в принципі до LiveData можуть надходити з різних джерел, -наприклад, з бази даних чи внаслідок HTTP запиту, і UI компонент не має знати, яким чином ці дані отримані. Це справа бізнес-логіки. Ще дуже важливо, що LiveData відслідковує стан життєвого циклу UI компонентів(observer), що підписались на нього, і "постачає" їм дані тільки у випадку, коли UI компонента перебуває в стані STARTED або RESUMED. Інакше компонента, що підписана як "спостерігач (observer) до LiveData, видаляється з підписки на оповіщення. Тим самим унеможливлюється витік пам'яті при зміні стану UI компонентів.
    Принципово важливо також, щоб ViewModel не містив ніяких посилань на UI компоненти. Причина все та ж - уникнути memory leak -витоку пам'яті.
    Щодо літератури. Оскільки Архітектурні компоненти Android були озвучені тільки на I/O 2017, літератури як такої небагато. Зате є багато статей. Але оскільки всі дописи посилаються на першоджерело, то для почаку варто прочитати і зрозуміти інформацію на ресурсі Android:
Кореневе посилання:
https://developer.android.com/topic/lib … hitecture/
Паралельно для кращого розуміння варто пройти невеликі код-тренінги CodeLab Google:
https://codelabs.developers.google.com/ … ecycles/#0
https://codelabs.developers.google.com/ … istence/#0
https://codelabs.developers.google.com/ … %2Findex#0
-десь в такому порядку.
Статей за рік вже дуже багато. Думаю, варто прочитати цю:
https://medium.com/google-developers/vi … efaef74a54
Останнім часом з'явилась мода наводити приклади в статтях на Kotlin, - нічого критичного, - але знайомитись з новим матеріалом комфортніше все-таки з прикладами на своїй робочій мові - Java. Хоча Kotlin, очевидно, потрібно буде знати нарівні з Java.
Взагалі, радив би підписатись на AndroidWeekly - щотижневик:
https://androidweekly.net/
Посилань в мене в закладках багато, - але гадаю краще все-таки почати з першоджерела і статті.
Якщо будуть запитання, - попробую в міру своїх знань відповісти.

Подякували: leofun01, andriesko2

7 Востаннє редагувалося PRY (12.06.2018 13:02:08)

Re: Надсилання даних з Activity до Fragment

Щодо літератури стосовно Android,- здебільшого користуюсь книгами з підписки
https://commonsware.com/
Підписка відносно не дорога - 20$ на півроку. На даний момент в підписку входить чотири книги і відповідно тематичні проекти на GitHub(доступні і без підписки). Зміст книжок оновлюється постійно, - наприклад, в червні вийшло чергове оновлення. Це його коротка анотація, яку прислали на E-mail:

CommonsWare Warescription Newsletter
June 2018

====================================

1. Book Updates

2. What's Happening?

++++++++++++++++++++++++++++++++++++

1. Book Updates

In mid-May, I released Version 0.3 of "Exploring Android", adding in a few
new tutorials and fixing some bugs:

https://commonsware.com/blog/2018/05/17 … eased.html

Then, a week ago, I released Version 8.12 of "The Busy Coder's Guide to
Android Development". This adds more Android P coverage, updates for
Android Studio 3.1, updates for ConstraintLayout 1.1.0, updates to some
of the testing chapters, and more:

https://commonsware.com/blog/2018/06/04 … eased.html

(or https://tinyurl.com/omnibus-8p12 if that URL is too long)

Note that the update to "The Busy Coder's Guide to Android Development"
retires the chapter on dynamic code, the chapter on Android Things, the
chapter on SlidingDrawer (from the Widget Catalog), and the chapter on
large screen strategies. Please hold onto Version 8.11 if you wish to
retain that material.

2. What's Happening?

With Android P Developer Preview 3 in our hands, and with Google I|O
behind us, the next major milestones are:

- the release of Android P in final form,

- the release of Android Studio 3.2 in final form, and

- the 1.0.0 release of the AndroidX libraries

The latter are the replacement for the Support Library, Architecture
Components, and so on. Officially, the final release of Android P
is "Q3", though my guess is that it will be in August or September.

I will be updating "The Busy Coder's Guide to Android Development" and
"Android's Architecture Components" between now and then, while in
tandem I start in on rewriting my material to take into account
Android Jetpack, AndroidX, and Kotlin. "Exploring Android" will be on
hold for several months, until I have enough rewritten material that
I can start in on Jetpack-ing the tutorials.

The exact timing of everything is contingent on what Google does
when, so I cannot make any long-range promises.

If you have any concerns about the future of the books, or if you
have any other major structural changes that you would like me to
consider, contact me at future@commonsware.com.
====================================

Приводжу це повідомлення повністю, бо з нього видно, наскільки оперативно вносяться зміни в книжки.

Подякували: andriesko1

8

Re: Надсилання даних з Activity до Fragment

Дякую за лінки) А ще таке питання, якщо я хочу до своєї Activity надсилати багато даних, то мені потрібно для кожних даних створювати окремий клас LiveData і підключати їх до однієї ViewModel?

9

Re: Надсилання даних з Activity до Fragment

Дивлячись, яку ціль Ви перед собою ставите, використовуючи об'єкт LiveData.
1)Можна створити кілька об'єктів типу LiveData для одного ViewModel, тоді будемо мати множину об'єктів типу LiveData, кожний з них буде спостерігатись в тому ж самому Activity своїм спостерігачем(observer), і містити свій певний об'єкт даних.
2)Можна в один об'єкт типу LiveData помістити об'єкт власного класу (наприклад, типу DataForUI), що міститиме потрібний Вам набір даних, і спостеріатись в  Activity одним спостерігачем. А дані вже в onChanged(...) витягуються з об'єкту класу DataForUI і розміщуються на відповідні об'єкти View Вашого UI.
Як на мене, то розділяти дані по різних LiveData можна було б за певними критеріями. Найбільш вірогідно, що це було б за функціональністю даних, тобто незалежні один від одного набори даних, чи щось інше. За джерелом надходження даних я б не розділяв, бо за це зазвичай відповідає т.з. Репозиторій,- шар між джерелом даних і ViewModel, і на рівні ViewModel невідомо, звідки отримані дані ( з мережі, бази даних , файлу, чи, наприклад, кешу).

Подякували: andriesko, leofun012