我正在尝试使用此处提供的答案How do you customise Glass contextual voice menu in an immersion *after* its initial setup?自定义我的Glass应用程序的菜单条目,但菜单永远不会重新创建。
该应用程序是我最终的家庭自动化大学项目。当用户打开灯时,我希望"打开灯"隐藏选项和"关灯"变得可见。
以下是我的一些代码:
@Override
public boolean onPreparePanel(int featureId, View view, Menu menu) {
mPreparePanelCalled = true;
if (isMyMenu(featureId)) {
shouldFinishOnMenuClose = true;
MenuItem menuLightOn = menu.findItem(R.id.action_turn_on_light);
MenuItem menuLightOff = menu.findItem(R.id.action_turn_off_light);
if (menuLight) {
menuLightOn.setVisible(false);
menuLightOff.setVisible(true);
} else {
menuLightOn.setVisible(true);
menuLightOff.setVisible(false);
}
return !mIsFinishing;
}
return super.onPreparePanel(featureId, view, menu);
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
if (isMyMenu(featureId)) {
shouldFinishOnMenuClose = true;
// Handle item selection.
switch (item.getItemId()) {
case R.id.action_unlock_door:
try {
handleUnlockDoor();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.action_lock_door:
try {
handleLockDoor();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.action_turn_on_light:
try {
handleTurnOnLight();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.action_turn_off_light:
try {
handleTurnOffLight();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.action_set_thermostat:
handleSetThermostat();
break;
case R.id.action_turn_on_kettle:
try {
handleTurnOnKettle();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.action_turn_off_kettle:
try {
handleTurnOffKettle();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.action_stop:
handleStop();
break;
}
}
invalidateOptionsMenu();
getWindow().invalidatePanelMenu(WindowUtils.FEATURE_VOICE_COMMANDS);
return super.onMenuItemSelected(featureId, item);
}
然后当调用相应的函数时,布尔值会改变:
private void handleTurnOnLight() throws IOException {
String retrievedData = null;
try {
retrievedData = new RetrieveData().execute(ServerUrl.serverUrl + "/lighton").get();
menuLight = true;
} catch (Exception e) {
e.printStackTrace();
}
Toast.makeText(this, retrievedData, Toast.LENGTH_LONG).show();
LiveCardService.refreshLiveCard(this);
}
private void handleTurnOffLight() throws IOException {
String retrievedData = null;
try {
retrievedData = new RetrieveData().execute(ServerUrl.serverUrl + "/lightoff").get();
menuLight = false;
} catch (Exception e) {
e.printStackTrace();
}
Toast.makeText(this, retrievedData, Toast.LENGTH_LONG).show();
LiveCardService.refreshLiveCard(this);
}
我是Glass开发的真正新手,所以任何建议都会受到高度赞赏。
谢谢。
答案 0 :(得分:0)
如果需要在选项菜单(而不是子菜单)上进行更改,则需要在onPrepareOptionsMenu
中进行更改。我认为按照您的方式调用它会起作用,但前提是您在invalidatePanelMenu
之前致电invalidateOptionsMenu
。但请注意,将代码移至onPrepareOptionsMenu
更有意义。
答案 1 :(得分:0)
要更新的上下文菜单,您也需要使其无效。 这可以通过使用以下
来完成getWindow().invalidatePanelMenu(WindowUtils.FEATURE_VOICE_COMMANDS);