2016-02-11 1 views
3

У меня есть три пункта меню «enable, diable, exit». то, что я хочу сделать, это, когда R.id.menu_enable_bt выбран, я хочу, чтобы отключить его с помощьюКак я могу изменить видимость элемента меню внутри onOptionsItemSelected (..)

menu.findItem(R.id.menu_enable_bt).setVisible(false); 

, но я не могу назвать

menu.findItem(R.id.menu_enable_bt).setVisible(false); 

изнутри onOptionsItemSelected (..) метод.

, как я могу изменить видимость пункта меню внутри onOptionsItemSelected (..)

КОД:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    Log.w(TAG, SubTag.msg("onCreateOptionsMenu")); 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 

    if (this.mBTAdapter.isEnabled()) { 
     menu.findItem(R.id.menu_enable_bt).setVisible(false); 
     menu.findItem(R.id.menu_disable_bt).setVisible(true); 
    } else { 
     menu.findItem(R.id.menu_enable_bt).setVisible(true); 
     menu.findItem(R.id.menu_disable_bt).setVisible(false); 
    } 

    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    super.onOptionsItemSelected(item); 
    Log.w(TAG, SubTag.msg("onOptionsItemSelected")); 

    switch (item.getItemId()) { 
     case R.id.menu_enable_bt: 
      Log.d(TAG, SubTag.bullet("onOptionsItemSelected", "menu_enable_bt")); 

      //menu.findItem(R.id.menu_enable_bt).setVisible(false); **how to do this** 
      this.mATEnableBT = new ATEnableBT(); 
      this.mATEnableBT.execute(); 
      break; 

     case R.id.menu_disable_bt: 
      Log.d(TAG, SubTag.bullet("onOptionsItemSelected", "menu_disable_bt")); 

      break; 

     case R.id.menu_exit: 
      Log.d(TAG,SubTag.bullet("onOptionsItemSelected", "menu_exit")); 

      finish(); 
      break; 
    } 
    return super.onOptionsItemSelected(item); 
} 

ответ

1

вы можете использовать invalidateOptionsMenu(), который будет Forse onCreateOptionsMenu называться снова.

Из документации

Объявите, что опции меню изменилось, так что должно быть воссоздано. Метод onCreateOptionsMenu (Меню) будет вызван в следующий раз, когда ему понадобится .

Там вы можете проверить условия и предпринять необходимые действия

0

Смотрите Javadoc для onPrepareOptionsMenu. Это ваша возможность внести изменения в меню, прежде чем оно станет видимым для пользователя. Поэтому вы должны поддерживать некоторые переменные-члены, описывающие, что должно быть видимым, и использовать это для изменения пунктов меню здесь.

+0

но я думаю, что я все еще выполняю ту же работу с onCreateOptionsMenu(), и я должен использовать некоторые переменные, описывающие, что должно быть видимым ... но мне нужно что-то вроде развязывания элемента, чтобы не сделать, например, не clickable после касания – user2121

+0

Если вы прочитали javadoc для метода, который я связал, он определенно говорит, что он используется для причины, о которой вы упоминаете. onCreateOptionsMenu используется для создания меню ONCE, а затем он снова используется с этой точки. После того, как он будет создан один раз, вы просто измените его после этого. Это стандартная практика. –