Garmin Monkey C切换视图后按钮点击事件处理异常问题
解决方案
以下是修复按钮点击事件不生效的关键步骤:
1. 让视图类实现MenuInputDelegate接口
你的weatherResultView需要明确实现WatchUi.MenuInputDelegate接口,才能正确关联菜单输入事件的处理逻辑:
class weatherResultView extends WatchUi.View implements WatchUi.MenuInputDelegate { // 类的成员变量和方法 }
2. 修正switchToView的委托参数
WatchUi.switchToView的第二个参数需要传入委托实例而非类本身。由于你的视图已经实现了MenuInputDelegate,直接传入视图实例即可:
// 先实例化视图再传入,避免重复创建对象 var resultView = new weatherResultView(data); WatchUi.switchToView(resultView, resultView, WatchUi.SLIDE_IMMEDIATE);
或者在视图的initialize方法中自行设置输入委托,这种情况下switchToView可省略第二个参数:
function initialize(data as Object) as Void { super.initialize(); // 将当前视图设为输入委托 self.inputDelegate = self; }
3. 确保onMenuItem是视图类的成员函数
把onMenuItem函数放在weatherResultView类内部作为成员方法,而非全局函数,同时必须添加对应菜单项才能触发点击:
class weatherResultView extends WatchUi.View implements WatchUi.MenuInputDelegate { function initialize(data as Object) as Void { super.initialize(); self.inputDelegate = self; // 添加上下文菜单项(必须添加才能响应对应点击) WatchUi.addMenuItem(:item_1, "刷新位置"); WatchUi.addMenuItem(:item_2, "测试选项"); } function onMenuItem(item as Symbol) as Void { switch ( item ) { case :item_1: { var pos = new weatherPosition(); pos.findPosition(); break; } case :item_2: { System.println("item 2"); break; } default: break; } } }
4. 核心注意事项
- 必须调用
WatchUi.addMenuItem添加对应菜单项,否则系统无法识别需要响应的按钮事件。 - 不要直接调用
MenuInputDelegate.initialize(),视图继承View时通过super.initialize()完成父类初始化即可。 - 委托实例必须是实现了
onMenuItem方法的对象,否则系统找不到事件处理逻辑。
内容的提问来源于stack exchange,提问作者major697
相关产品推荐
相关产品推荐

