DroidScript

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

DroidScript
инструменты для мобильной разработки

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

Оглавление  

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

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

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

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

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

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

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

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

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

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

  • все данные в сценарии являются строками без выделения их кавычками
  • для группировки команд можно использовать пустые строки
  • для отключения команд из обработки служит однострочный комментарий, начинающийся с символов //
  • данные, относящиеся к 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 droidscript.ru admin@droidscript.ru