Menu2 from XML - problems with Rez and menu-item ids

Hi all.

I can't get past a problem with menu2 defined in XML: the ids of menu elements are apparently not assigned to menu entries. Since I have little experience with CIQ development, I might be doing something wrong.

I made a simple app which reproduces my problem out of a "widget" template and some sample code.

// app.mc
// This file was generated from "Widget" sample, except for row 21
using Toybox.Application;

class ciqtestmenu2App extends Application.AppBase {

    function initialize() {
        AppBase.initialize();
    }

    // onStart() is called on application start up
    function onStart(state) {
    }

    // onStop() is called when your application is exiting
    function onStop(state) {
    }

    // Return the initial view of your application here
    function getInitialView() {
        return [ new ciqtestmenu2View(), new ciqtestmenu2InitialDelegate() ]; //added a delegate here
    }

}
// initialDelegate.mc

using Toybox.System;
using Toybox.WatchUi;

class ciqtestmenu2InitialDelegate extends WatchUi.BehaviorDelegate
{
	function initialize()
	{
		BehaviorDelegate.initialize();
	}
	
	function onMenu()
	{
		// Next line of code was taken from 
		// https://developer.garmin.com/connect-iq/programmers-guide/user-interface#builtinhandlers 
		// example for menu (not menu2, because there is no example of how to push XML-defined menu2 view)
		WatchUi.pushView(new Rez.Menus.MainMenu(), new Menu2Delegate(), WatchUi.SLIDE_UP);
		return true;
	}

}
// initialView.mc
// This file was generated from "Widget" sample
using Toybox.WatchUi;

class ciqtestmenu2View extends WatchUi.View {

    function initialize() {
        View.initialize();
    }

    // Load your resources here
    function onLayout(dc) {
        setLayout(Rez.Layouts.MainLayout(dc));
    }

    // Called when this View is brought to the foreground. Restore
    // the state of this View and prepare it to be shown. This includes
    // loading resources into memory.
    function onShow() {
    }

    // Update the view
    function onUpdate(dc) {
        // Call the parent onUpdate function to redraw the layout
        View.onUpdate(dc);
    }

    // Called when this View is removed from the screen. Save the
    // state of this View here. This includes freeing resources from
    // memory.
    function onHide() {
    }

}
// menu2Delegate.mc
// This code is from Class: Toybox::WatchUi::Menu2InputDelegate API reference
using Toybox.WatchUi;
using Toybox.System;

class Menu2Delegate extends WatchUi.Menu2InputDelegate {
    function initialize() {
        Menu2InputDelegate.initialize();
    }

    function onSelect(item) {
        System.println(item.getId());
    }
}

I've created a folder "menus" inside existing "resources" folder and added the following XML file menu.xml (sample code from https://developer.garmin.com/connect-iq/programmers-guide/user-interface#menu2xmlresources)

<menu2 id="MainMenu" title="@Strings.MainMenuTitle">
    <menu-item id="generic1" label="Generic 1" subLabel="With Sublabel"></menu-item>
    <menu-item id="generic2" label="Generic 2"></menu-item>
</menu2>

Added a string to existing ./resources/strings.xml:

<strings>
    <string id="AppName">ciq-test-menu2</string>
    <string id="MainMenuTitle">Settings</string>
</strings>

I get these warnings during build time:

BUILD: WARNING: Rez:37: Unable to detect scope 'MenuItem' for the symbol 'initialize'.
BUILD: WARNING: Rez:38: Unable to detect scope 'MenuItem' for the symbol 'initialize'.

and the following console output after selecting (and pressing for confirmation) both menu2 entries in simulator:

symbol (21)
symbol (22)

The result I'm expecting should be something like "generic1" and "generic2" given the ids.

I'm using connectiq-sdk-lin-3.1.6-2019-10-23-2de4665c6 with Eclipse.

Parents
  • Hi,

    There seems to be nothing wrong.

    Actually, the strings "generic1 and "generic2" are the keys to the symbols dictionnary. You cannot show them, but do you need to?

    You can also print the keys:

    System.println(item.getId());
    System.println("Generic1: " + :generic1);
    System.println("Generic2: " + :generic2);

    All you need to do is check the ID with the key (mind the ':'):

    if (item.getId() == :generic1) {
        ...
    }

Reply
  • Hi,

    There seems to be nothing wrong.

    Actually, the strings "generic1 and "generic2" are the keys to the symbols dictionnary. You cannot show them, but do you need to?

    You can also print the keys:

    System.println(item.getId());
    System.println("Generic1: " + :generic1);
    System.println("Generic2: " + :generic2);

    All you need to do is check the ID with the key (mind the ':'):

    if (item.getId() == :generic1) {
        ...
    }

Children