Приложение Garmin ConnectIQ со списком / меню в качестве первого вида
Как настроить первый вид моего приложения для часов как меню или аналогичный список прокрутки?
Я вижу это поведение все время на Fenix 5; например, в приложении "Навигация" (нажмите "выбрать", выберите "Навигация"), на первом экране отображается список параметров с прокруткой. Мне нужно то же самое в моем приложении, с помощью списка, который создается и контролируется программно.
Однако возвращение меню из getInitialView () дает мне "неожиданную ошибку типа".
Просто чтобы уточнить: мне все равно, если это на самом деле меню. Но я хочу, чтобы я мог видеть сразу несколько элементов в списке, и если список больше экрана, используйте кнопки "вверх" и "вниз" для его прокрутки. Наличие элементов в пользовательских видах, которые я могу нарисовать программно, было бы большим плюсом.
Я думаю, я мог бы вручную нарисовать список и вручную реализовать плавную прокрутку; но это слишком утомительно. Я должен верить, что для этого есть встроенное средство, поскольку я вижу, что именно это происходит последовательно во многих местах.
(Обратите внимание, что я спрашиваю о приложении для часов - то есть о том, что вы можете получить, нажав "выбрать" (вверху справа) и выбрав его из списка. Не виджет, циферблат или поле данных.)
(Отредактировано, чтобы уточнить приложение для часов и использовать Navigate в качестве примера.)
1 ответ
К сожалению, вы не можете настроить первое представление вашего приложения (независимо от типа приложения) как меню. Инфраструктура CIQ ожидает, что вызов функции getInitialView() вернет массив с первым элементом - объектом типа View. Если вы используете встроенную поддержку для меню, вы получите сообщение об ошибке.
Вместо этого вам придется создать свой собственный "вид", который отображает меню (которое вы отображаете вручную), а затем обрабатывать ввод вверх / вниз вручную с помощью своего собственного объекта InputDelegate.
Следует отметить, что создание собственной системы меню будет работать только с часовым приложением. С циферблатами и полями данных нет никакой возможности обрабатывать любые входные события, а с виджетами ваш объект InputDelegate не будет получать никаких событий ВВЕРХ или ВНИЗ, пока вы не замените свой первоначальный вид вторым. Когда вы визуализируете второй вид на виджете, обычно после того, как пользователь нажимает кнопку запуска, ваш объект InputDelegate будет получать все события.
Другой вариант - отобразить заголовок приложения и / или типичную информацию в начальном представлении и установить таймер, чтобы выдвигать новый вид (который будет вашим меню) примерно через секунду после отображения начального экрана. Эта опция позволит вам использовать встроенные функции меню и, таким образом, уменьшить сложность кода, что особенно удобно, если вы планируете поддерживать несколько устройств с различными размерами и стилями.
Я не запускал код, но что-то вроде этого для вашего начального представления должно работать:
class SomeView extends Ui.View {
var startupTimer;
var isFirstTime = true;
function initialize(ident,page) {
startupTime = new Timer.Timer();
}
function onShow() {
if (isFirstTime) {
isFirstTime = false;
startupTimer.start( method(:startupTimerCallback), 1000, false );
}
}
function onUpdate(dc) {
if (isFirstTime) {
// render the startup view (title, version, etc) here...
}
}
function startupTimerCallback() {
Ui.pushView(new Rez.Menus.MainMenu(), new MainMenuInputDelegate(), Ui.SLIDE_LEFT);
}
}