Очень часто возникает необходимость в передаче данных от одного экрана Android к другому. И, например, у меня, поначалу, эта задача вызвала затруднения. Как всегда, проблема была в том, что было непонятно куда лезть за ответом. Долго ковырялся на гугловском форуме по App Inventor. Хотя, как оказалось потом, это проще простого. Да и в руководствах по App Inventor всё необходимое есть. Хочу в этой статье упростить для вас этот путь.
Для решения этой задачи есть несколько способов:
1. Используем стандартный инструмент для передачи данных с одного экрана на другой, а именно обработчик “open another screen with start value”, который можно найти в блоке “Control”
Здесь, к “screenName” присоединяем название экрана, который надо открыть, например:
Эту «пазлину» можно достать из блока “Text” и вписать название требуемого экрана.
В гнездо ниже вставляем те данные, которые нам необходимо передать. Например, содержимое одного из компонентов “Label”.
Далее пристраиваем эту конструкцию в обработчик того компонента, который нам нужен, например, кнопки и получаем:
То есть, с первого экрана на второй должно передаться значение из “Label1”.
Теперь нам необходимо получить это значение на втором экране. Предположим, что получателем данных на втором экране будет тоже текстовое поле, которое назовём “Label2”. Для это строим на втором экране следующую конструкцию:
Из картинки, наверное, уже понятно, что при клике по кнопке поле “Label2” должно быть чем-то заполнено. Чем? А вот как раз данными, переданными из первого экрана.
Но разобранный вариант подходит для передачи одного значения. Гораздо чаще их надо передать несколько.
Итак, предполагаем ,что нам надо передать данные из двух полей для ввода текста “TextBox” в текстовые поля “Label” с номерами 1 и 2, соответственно.
Для решения этой задачи нам нужно будет залезть в блоки “Lists” и “Math” – «Списки» и «Математика». Используя необходимые блоки, строим теперь вот эдакую конструкцию:
Здесь всё почти так же как и в предыдущем варианте, но мы вызываем блок создания списка “make a list” (создать список) и запихиваем в этот список нужные значения.
Для получения данных на втором экране, по-прежнему, делаем почти то же, что и в первом варианте, с небольшими изменениями:
Для извлечения данных вызываем их из списка. Цифры – это номера значений в том порядке, в котором они выгружались с первого экрана. То есть, “TextBox1” попал в список первым, значит, под номером «1» его и извлекаем.
Как видите, всё просто.
2. Используем TinyDB с одинаковым именем для разных экранов. Это, по-моему, нештатный метод для App Inventor. По крайней мере, мне не удалось найти его в туториалах. Он заключается в том, что для каждого экрана используется компонент TinyDB, причём обязательно с одинаковым именем.
Итак, задача, примерно, та же – передать значение из поля ввода текста на первом экране в текстовое поле на втором по нажатию кнопки на втором экране.
Размещаем на обоих экранах по компоненту TinyDB. По умолчанию название одинаковое — “TinyDB1”.
На первом экране складываем из «пазлов»:
Блок “StoreValue”, при нажатии кнопки, берёт значение из поля “TextBox3” и под именем «Значение» помещает его в базу данных.
На втором экране «рисуем»:
В результате, происходит следующее: блок “ GetValue” извлекает из БД «Значение» и оно присваивается полю “Label3”. Поскольку имя БД одно и то же, то и «Значение» будет таким же. Нижняя строчка блок задаёт то, что если «Значение» в БД отстутствует, то полю “Label3” будет присвоено значение “Label3” (смысловой перевод : «если значение отсутствует»).
Этот метод нравится мне тем, что помимо передачи данных он обеспечивает помещение этих данных в базу данных приложения Android. Благодаря этому данные сохраняются при выключении приложения, да и самого устройства.
Возможно, что в App Inventor есть и другие способы передачи данных от одного экрана к другому, но мне вполне хватает этих.