LABA 120 - Передача данных между экранами, в приложении для андроид на MIT App Inventor 2


Передача данных между экранами, в приложении для андроид

на MIT App Inventor 2

Омск, начало 04-2020

Разные независимые экраны, андроид походу унаследовал
от старых кнопочных телефонов, те кто кодил на
J2ME увидит сходство. Для чего это сделано не совсем ясно,
ну да ладно - Традиции великая вещь

Однако в приличных программах принято отделять окно с настройками,
от окна основной программы, а еще и справка бывает..

Как это можно организовать в MIT App Inventor 2 ?


Добавим в наш проект второй экран Screen2 , добавим на него кнопку и текстовое поле.
В текстовом поле будем изменять значение некоторого условного параметра.
Нажатие кнопки сохраняет значение текстового поля, и закрывает Screen2
для этого в среде разработки имеется специальный блок


Close screen with value result

На главном экране понадобится кнопка для открытия Screen2
по нажатии на которую будет срабатывать блок




Open another screen screenName Screen2

это видео иллюстрирует логику работы "Экранов" андроида



Однако все переменные которые вы определите для Screen2
будут доступны только в нем. Так что если захочется пользоваться
любыми другими блоками , например Clock, LightSensor или LocationSensor
придется их также добавлять на этот экран.

Параметры с этих блоков так же останутся доступными только здесь
Это прекрасно видно на этой картинке

 Clock, LightSensor или LocationSensor

приложение одно, экрана два, и у каждого свой набор компонентов

Если на каждый экран поставить таймер, и устроить счетчик,
то будет очевидно, что на главном экране все идет своим чередом
а вот состояние Screen2 обнуляется каждый раз как мы его закрываем.

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

блоком Call TiniDB1.StoreValue
И считывать при открыии экрана 2 блоком Call TinyDB.GetValue




компонента TinyDB из вкладки Storage



Так как же передать измененные настройки в главный экран?


В MIT App Inventor 2 для этого имеется простая конструкция
When Screen1.OtherScreenClosed

программирование под андроид на MIT App Inventor 2

она срабатывает при закрытии дополнительных окон

В этом блоке имеется две локальные переменные
otherScreenName , в ней содержится название закрытого окна,
ибо окон может быть более двух, и кто что вернул будет не совсем ясно

и переменная Result . В ней хранится возвращенное, в данном случае,
значение, из текстового поля Screen2

Сразу возникает вопрос , а если параметров много?


Несколько значений можно разделить запятыми
и в последствии обработать блоком

List from csv row text (здесь создается массив из текста с запятыми)
программирование под андроид на MIT App Inventor 2


и затем блоком
select list item list (выбирает данные по индексу из массива)
программирование под андроид на MIT App Inventor 2


Для примера
Добавим на Screen2 еще текстовых полей а на Screen1 меток
и изменим код программы

теперь все в порядке, передается несколько параметров


-------------------
программирование под андроид на MIT App Inventor 2
блок When Screen1.OtherScreenClosed