РЕДАКТИРОВАТЬ: этот вопрос был для устаревшей панели действий sherlock. Вместо этого теперь следует использовать библиотеку поддержки Android
Я добавил пункт меню панели действий под названием поделиться для моего fragment
которая появляется, но событие выбора не перехватывается
Я добавляю это вот так
@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
MenuItem item = menu.add(0, 7,0, R.string.share);
item.setIcon(R.drawable.social_share).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
Пытаюсь запечатлеть это как в том, так fragment
и в fragment activity
подобном
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 7:
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("text/plain");
share.putExtra(Intent.EXTRA_TEXT, "I'm being sent!!");
startActivity(Intent.createChooser(share, "Share Text"));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
а у меня setHasOptionsMenu(true);
в onCreate()
.
источник
У меня была та же проблема, но я думаю, что лучше подвести итог и представить последний шаг, чтобы он заработал:
Добавьте
setHasOptionsMenu(true)
метод в свойonCreate(Bundle savedInstanceState)
метод фрагмента .Переопределение
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
(если вы хотите сделать что-то другое в меню своего фрагмента) иonOptionsItemSelected(MenuItem item)
методы в своем фрагменте.Внутри
onOptionsItemSelected(MenuItem item)
метода Activity убедитесь, что вы вернулись,false
когда действие пункта меню будет реализовано вonOptionsItemSelected(MenuItem item)
методе Fragment .Пример:
Деятельность
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Do Activity menu item stuff here return true; case R.id.fragment_menu_item: // Not implemented here return false; default: break; } return false; }
Фрагмент
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); .... } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Do something that differs the Activity's menu here super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Not implemented here return false; case R.id.fragment_menu_item: // Do Fragment menu item stuff here return true; default: break; } return false; }
источник
return false
на ActivityonOptionItemSelected
- это ключ. просто заменитеreturn super.onOptionItemSelected(item);
Я заметил, что решение, которое вам дали люди, заключалось в том, чтобы реализовать код для вашего элемента меню в действии, а не во фрагменте. Я думаю, что это будет выглядеть намного более организованным, если вы внедрили код во фрагмент, а не в действие, потому что, на мой взгляд, это выглядит лучше. Для этого сделайте следующее:
Деятельность
@Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.SomeIDInTheMenueOfTheActivity: { //something(); break; } default: //do something default and add the code under : return super.onOptionsItemSelected(item); } return true; }
Фрагмент
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.SomeIDInFragmentMenue: { break; } default: return super.onOptionsItemSelected(item); } return true; }
Теперь строки (и тому подобное): «return super.onOptionsItemSelected (item);» в действии и фрагменте очень важны, потому что, как если бы вы следовали коду при отладке, вы увидите, что функции событий меню будут вызываться сначала в действии, и если элемент не соответствует идентификатору в переключателе действия - case, строка с ошибкой: "super.onOptionsItemSelected (item);" вызовет функцию onOptionsItemSelected для фрагмента, как мы и хотели. (если у вас много фрагментов, убедитесь, что в них тоже есть эта строка, так как вызов hirarchy может быть несколько сложным).
источник
Я использую actionbarsherlock. Это сработало для меня:
1) Создайте меню dummy_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="fill_parent" > <item android:title="" android:showAsAction="never" android:id="@+id/dummyMenu" />
2) В действии раздуйте меню так:
@Override public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) { com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.dummy_menu,menu); return super.onCreateOptionsMenu(menu); }
3) Во фрагментах onCreateView вызовите setHasOptionsMenu (true) и переопределите onCreateOptionsMenu и onOptionsItemSelected, также скройте подобное dummyMenu (во фрагменте)
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fragment_actions, menu); MenuItem item = menu.findItem(R.id.dummyMenu); item.setVisible(false); super.onCreateOptionsMenu(menu, inflater); }
Надеюсь, это кому-то поможет.
источник
Редактировать для использования Шерлока на панели действий
Мне пришлось использовать
public boolean onMenuItemSelected(int featureId, MenuItem item) {
в основном действии, чтобы захватить пункт меню
источник
onContextItemSelected
вместоonOptionsItemSelected
.onMenuItemSelected
Просто пересылает нажмите на правильный метод, поэтому он , как представляется , лучше работать.это настолько просто, что вы можете сделать это в своем фрагменте, чтобы убедиться, что ваше действие будет правильно прослушиваться:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); }
источник
У меня была такая проблема. Это потому, что я игнорировал неправильный метод
onOptionsItemSelected (элемент com.actionbarsherlock.view.MenuItem) - это то, что я использовал.
Убедитесь, что вы используете правильный!
источник
Вы не связываетесь с суперклассом в методах действия. Пожалуйста, пусть onCreateOptionsMenu () возвращает super.onCreateOptionsMenu (меню), а onOptionsItemSelected () возвращает super.onOptionsItemSelected (item) (за исключением обрабатываемого вами элемента, который должен возвращать true, чтобы указать, что вы обработали событие)
источник
вы должны добавить этот код в
toolbar.bringToFront();
следующую панель инструментов в своей деятельностиpublic class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { ... Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setTitle("Yazd"); setSupportActionBar(toolbar); toolbar.bringToFront(); // <<= add here ...
источник