Экспериментальная версия (расширение, проект AI, файл сценария скачать zip)
Предлагаемое расширение позволяет:
Основным функциональным блоком расширения является функция 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 и необходимые для его вызова аргументы.
Пример сценария
Команды сценария располагаются внутри именованных тегов, которые можно представить в качестве именованных функций. Правила составления командного файла:
В сценарии выше показаны примеры вызовов команд 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.