onOptionsItemSelected не вызывается при использовании actionLayout (SherlockActionBar)

Метод onOptionsItemSelected не вызывается при использовании actionLayout в элементе меню. Я что-то упустил, или это известная проблема с SherlockActionBar?

Мероприятия

@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.article, menu); super.onCreateOptionsMenu(menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Log.d(TAG, "onOptionsItemSelected()"); switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.menu_item_comment: return true; default: return super.onOptionsItemSelected(item); } } 

Меню

  

ну, вы должны установить onClickListener на этом actionLayout для получения обратного вызова. Я делаю это так:

 @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.map_menu, menu); for (int i = 0; i < menu.size(); i++) { MenuItem item = menu.getItem(i); if (item.getItemId() == R.id.menu_more) { itemChooser = item.getActionView(); if (itemChooser != null) { itemChooser.setOnClickListener(this); } } } return super.onCreateOptionsMenu(menu); } 

Вы должны использовать MenuItemCompat.getActionView (menuItem); вместо item.getActionView (); если вы разрабатываете более старую версию.

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); for (int i = 0; i< menu.size() ;i++) { MenuItem menuItem = menu.getItem(i); if (menuItem.getItemId() == R.id.add_item) { View view = MenuItemCompat.getActionView(menuItem); if (view != null) { view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, ToDoActivity.class); startActivity(intent); } }); } } } return true; } 

Вам нужно будет добавить свой собственный OnClickListener и явно вызвать onOptionsItemSelected :

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuItem awesomeMenuItem = menu.findItem(R.id.action_awesome); View awesomeActionView = menuItem.getActionView(); awesomeActionView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onOptionsItemSelected(awesomeMenuItem)); } }); } 

PS: Не знаю, почему это не работает из коробки.

Объединив ответы @Arun Kumar и @ Luten, метод ниже сделает реализацию общей. Для всех элементов меню, использующих actionView , мы устанавливаемOnClickListener для вызова onOptionsItemSelected (item) . Таким образом, мы можем смешивать и сопоставлять обычные пункты меню actionLayout, не беспокоясь об установке отдельных onClickListeners.

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.clear(); inflater.inflate(menuResourceId(), menu); for (int i = 0; i < menu.size(); i++) { final MenuItem item = menu.getItem(i); View actionView = MenuItemCompat.getActionView(item); if (actionView != null) { actionView.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ onOptionsItemSelected(item); } }); } } super.onCreateOptionsMenu(menu, inflater); } 
 @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.main, menu); View view = menu.findItem(R.id.menu_item_comment).getActionView(); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // do something } }); return true; } 

Кроме того, (и это было очень важно для меня, поэтому другие ответы не работали) вам нужно отключить возможность просмотра всех видов в макете действий (то есть action_bar_comment_layout.xml):

 android:clickable="false" 
  • Тег Html List не работает в текстовом виде Android. Что я могу сделать?
  • Как очистить конкретную активность от истории стека?
  • Как избежать ошибки из памяти при использовании растровых изображений в Android
  • Как найти MAC-адрес устройства Android программно
  • Диалог ввода текста
  • Bitmap getWidth возвращает неверное значение
  • Увеличение и уменьшение масштаба изображения в Android
  • Коммуникация между fragmentом и активностью - лучшие практики
  • Получить выбранный элемент с помощью флажка в Listview
  • TileProvider с использованием локальной плитки
  • Как написать код для создания sharedpreferences для массива в android?
  • Давайте будем гением компьютера.