2015-02-01 2 views
1

Мне нужно было менять элементы меню динамически во время события щелчка элементов меню.onprepareoptionsmenu был вызван по умолчанию

Итак, я внедрил onOptionsItemВыбранный в действии.

public class ResultActivity extends Activity { 

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main_actions, menu); 
     return true; 
    } 
} 

и я звоню invalidateOptionsMenu в onOptionsItemSelected метод, который INTURN следует называть onPrepareOptionsMenu

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    switch (id){ 
      case R.id.action_group: { 
       invalidateOptionsMenu(); 
       break; 
      } 
       } 
} 

Кроме того, я пытаюсь удалить один элемент из меню в методе onPrepareOptionsMenu ,

@Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 


     Log.d(TAG,"In onPrepareOptionsMenu"); 
     menu.removeItem(R.id.action_group); 
     Log.d(TAG,"Group icon is removed"); 

     return super.onPrepareOptionsMenu(menu); 
    } 

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

Может кто-нибудь сказать, что проблема .. ТИА

ответ

1

Проблема заключается в том, что onPrepareOptionsMenu(Menu) вызывается в любом случае, в любое время ваше меню должно быть показано или перезагружается. Это включает в себя вызовы, исходящие от invalidateOptionsMenu(), но также и от создаваемой деятельности.

Вы можете, например, проверить логическое состояние перед фактическим удалением элемента.

public boolean mRemoveItem; 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
int id = item.getItemId(); 
switch (id){ 
     case R.id.action_group: { 
      mRemoveItem = true; 
      invalidateOptionsMenu(); 
      break; 
      } 
      } 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 

    if (mRemoveItem) { 
    menu.removeItem(R.id.action_group); 
    } 
    return super.onPrepareOptionsMenu(menu); 
} 

соответствии с вашими потребностями, вам нужно будет установить mRemoveItem назад false в какой-то момент в вашем коде.

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