DroidScript
DroidScript
учимся и разрабатываем

Расширение CallFromString для App Inventor

15.06.2018

Экспериментальная версия (расширение, проект AI, файл сценария скачать zip)

Предлагаемое расширение позволяет:

  • Создавать виджеты по названию их классов
  • Вызывать методы встроенных (App Inventor) и динамически созданных виджетов
  • Добавлять встроенные объекты в список для дальнейшей работы с ними
  • Создавать экраны программным образом
  • Использовать обобщённые обработчики событий заданных типов событий
  • Получить список методов указанного класса
  • Вести журнал логов
  • Объединять команды в сценарии xml-формата

Основным функциональным блоком расширения является функция runCommand, которая транслирует полученную строковую команду в вызов метода Android API, добавляет сообщение в список логов и возвращает результат. Объявление этой функций выглядит так:

String runCommand(String str), где str – текст команды

Для данной команды используется блок runCommand.

Выполнить команду

Создайте этот блок и в текстовое поле введите строку:

ShowClassMethods(com.google.appinventor.components.runtime.Form)

После выполнения блока на экране отобразится диалоговое окно со списком методов класса Form.

Блок runCommand не позволяет вызывать методы виджетов App Inventor, существующих в приложении. Для вызова методов в этом случае используется блок CallMethodAndroidAPI:

Вызов метода для встроенного объекта

В данном примере происходит вызов метода установки цвета фона для виджета vaDemo.

Для выполнения последовательности команд можно либо использовать последовательность блоков runCommand, либо использовать цикл для вызова всех команд из списка.

Последовательный вызов команд

Для создания больших сценариев удобно пользоваться сторонним текстовым редактором, например, DroidScript WiFi IDE, который позволяет на PC открывать файлы, находящиеся на устройстве Android.

Каждая команда сценария содержит имя команды, имя метода Android и необходимые для его вызова аргументы.

Пример сценария

Команды сценария располагаются внутри именованных тегов, которые можно представить в качестве именованных функций. Правила составления командного файла:

  • все элементы должны находиться в корневом элементе <script>
  • все данные в сценарии являются строками без выделения их кавычками
  • для группировки команд можно использовать пустые строки
  • для отключения команд из обработки служит однострочный комментарий, начинающийся с символов //
  • данные, относящиеся к Android API (названия классов, методов, названия типов параметров данных методов, константы и др.) вводятся в полном соответствии с тем, как они указаны в документации по Android API. Это сделано для более легкого изучения интерфейса и удобной трансляции кода Java в команды и обратно
  • аргументы для метода Android перечисляются через символ точки с запятой “;” и представляют собой пары значений, разделённых символом двоеточия “:” (тип:значение)
  • для правильного отображения экрана необходимо создать два контейнера - внешний и внутренний. Виджеты добавляются во внутренний контейнер, который добавляется внешнему - подложке
  • для корректного закрытия динамического экрана необходимо произвести удаление виджетов и компоновщиков в таком порядке:
    • удалить все виджеты из компоновщика lay1 – команда CallMethod(lay1,removeAllViews)
    • удалить компоновщик lay1 – команда RemoveView(lay1)
    • удалить компоновщик layScreen – команда RemoveView(layScreen)

В сценарии выше показаны примеры вызовов команд CreateView (создать виджет), CreateLayoutParams (создать параметры раскладки) и CallMethod (вызвать метод Android API). При вызове каждой из этих функций производится запись в журнал логов, который можно просмотреть, вызвав метод GetLogs, или очистить методом ClearLogs.

Ниже приводится описание функции (команд) расширения

CreateView - создать виджет

CreateView(className, objectName)

, где

className – название класса Android в формате простого имени (Button, Spinner и т.п.)
objectName – уникальное и непустое имя создаваемого объекта.

При успешном создании объекта он помещается в глобальный ассоциативный список виджетов, в котором он будет доступен по своему имени.

При создании объекта также создаётся ссылка на общий обработчик событий. Например, для кнопки – ссылка на обработчик щелчка Click, для текстового поля ввода – ссылка на обработчик нажатия на клавишу KeyPress. Эти обработчики доступны в редакторе блоков и возвращают имя объекта, который вызвал событие.

CreateLayoutParams – создать параметры раскладки

CreateLayoutParams(objectName, horzLayout, vertLayout)

, где

objectName – имя создаваемого параметра
horzLayout – горизонтальный параметр
vertLayout – вертикальный параметр

В качестве параметров используются следующие константы:

ViewGroup.LayoutParams.MATCH_PARENT – контейнер занимает всю доступную область родителя
ViewGroup.LayoutParams.WRAP_CONTENT – контейнер занимает область, исходя из его содержимого

CallMethod – вызвать метод

CallMethod( objectName, methodName, type1:value1; typeN:valueN)

, где

objectName – имя объекта, для которого нужно вызывать метод
methodName – имя метода
type1..typeN – имена типов параметров из сигнатуры метода
value1..valueN – значение параметров

Указание типов аргументов необходимо для точного определения нужного метода Android, так как некоторые из них являются перегруженными. Для успешного поиска метода следует в точности задать его заголовок, который можно найти в справке по Android API или диалоге, отображаемом при использовании метода ShowClassMethods:

ShowClassMethods(String className), где className – полное название класса, например, android.widget.LinearLayout

Рассмотрим пример вызова метода setText для задания надписи. Один из вариантов его объявления выглядит так:

setText (CharSequence text)

Значит, для вызова данного метода необходимо указать его имя setText и один параметр CharSequence. Регистр букв имеет значение:

CallMethod( EditText, setText, CharSequence:Открыть) – правильный вызов
CallMethod( EditText, SetText, CharSequence:Открыть) – ошибка в имени метода
CallMethod( EditText, setText, String:Открыть) – ошибка в названии типа

В качестве значений аргументов можно указывать строки:

ViewGroup.LayoutParams.WRAP_CONTENT
ViewGroup.LayoutParams.MATCH_PARENT
LinearLayout.HORIZONTAL
LinearLayout.VERTICAL

Цвет задаётся строкой в привычном шестнадцатеричном формате #ARGB, например, #ff00ffff.

В расширении реализован механизм перехвата исключений, но в некоторых случаях AI Companion может завершиться с ошибкой. Например, ошибка возникает при попытке создания виджета Switch. Для определения причины возникновения таких ошибок используйте отладчик adb.

Также замечена невозможность смены цвета фона встроенного компоновщика Layout, если в дизайнере ему задан цвет, отличный от None.

© 2016-2024 
actech