invalidateOptionsMenu未在Glass上重新创建菜单

时间:2015-04-10 10:30:25

标签: android google-glass google-gdk

我正在尝试使用此处提供的答案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开发的真正新手,所以任何建议都会受到高度赞赏。

谢谢。

2 个答案:

答案 0 :(得分:0)

如果需要在选项菜单(而不是子菜单)上进行更改,则需要在onPrepareOptionsMenu中进行更改。我认为按照您的方式调用它会起作用,但前提是您在invalidatePanelMenu之前致电invalidateOptionsMenu。但请注意,将代码移至onPrepareOptionsMenu更有意义。

答案 1 :(得分:0)

要更新的上下文菜单,您也需要使其无效。 这可以通过使用以下

来完成
getWindow().invalidatePanelMenu(WindowUtils.FEATURE_VOICE_COMMANDS);