2015-04-10 6 views
0

Я пытаюсь настроить записи меню для своего приложения Glass, используя приведенный здесь ответ How do you customise Glass contextual voice menu in an immersion *after* its initial setup?, но меню никогда не воссоздается.invalidateOptionsMenu не воссоздает меню на стекле

Приложение - это мой окончательный университетский проект для автоматизации дома. Когда пользователь включит свет, я бы хотел, чтобы опция «включить свет» была скрыта, и «выключить свет» станет видимым.

Вот некоторые из моего кода:

@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); 
} 

Я настоящий новичок в разработке стекла, поэтому любой совет будет очень признателен.

спасибо.

ответ

0

Если изменения необходимо сделать в меню параметров (а не подменю), вам необходимо внести изменения в onPrepareOptionsMenu. Я думаю, что называть его так, как вы делаете, будет работать, но только если вы позвоните invalidatePanelMenu до invalidateOptionsMenu. Однако имейте в виду, что имеет смысл переместить код на onPrepareOptionsMenu.

+0

Большое спасибо за быстрый ответ, я попробовал оба ваши предложения, но, к сожалению, они не работали для меня. Если вы хотите посмотреть на весь мой код, он доступен по адресу https://github.com/sephallen/HomeAutomationForGlass –

0

для контекстного меню, которое необходимо обновить, необходимо также аннулировать его. Это может быть сделано с помощью следующих

getWindow().invalidatePanelMenu(WindowUtils.FEATURE_VOICE_COMMANDS); 
+0

Спасибо за ответ, я вызываю это уже в onMenuItemSelected override, но он не работает для меня. Возможно, это неправильное место, чтобы назвать это? –

+0

Я попытался использовать 'setVisible (true)' в моем собственном проекте, и он, похоже, тоже не работает для меня. То, что я делаю в своей собственной 'onPreparePanel', раздувает новое меню в зависимости от определенного состояния. Вы можете попробовать это. Но, похоже, эта работа по сравнению с тем, что вы пытаетесь сделать здесь. – NoSixties

+0

Это то, что я рассмотрел, но не нужно ли мне создавать любую возможную версию сочетания вещей, которые можно включать и выключать как отдельное меню? –

 Смежные вопросы

  • Нет связанных вопросов^_^