Я следую за этим tutorial, и я пишу простой Activity
.onOptionsItemSelected никогда не называется
...
UPDATE: После того, как ваши советы Я редактировал мое приложение, но метод onOptionsItemSelected()
все еще не вызывается, когда я выбираю пункт из всплывающего меню. Всплывающее меню раздувается, когда пользователь нажимает на элемент из панели действий.
Активность:
public class Map extends AppCompatActivity implements
GoogleMap.OnMapLongClickListener, GoogleMap.OnMarkerClickListener,
GoogleMap.OnMapClickListener, OnMapReadyCallback,
ResourceState.OnResourceStateChangeListener {
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
Map.menu = menu;
getMenuInflater().inflate(R.menu.map_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
...
case R.id.menu_item_map_type:
// Here I show the popup
PopupMenu popup = new PopupMenu(this, findViewById(R.id.menu_item_map_type));
popup.getMenuInflater().inflate(R.menu.map_popup, popup.getMenu());
popup.show();
break;
case R.id.menu_item_satellite:
// here the method onOptionsItemSelected is not directly called
break;
case R.id.menu_item_street:
// here the method onOptionsItemSelected is not directly called
break;
}
return super.onOptionsItemSelected(item);
}
public void callOnOptionsItemSelected(MenuItem item) {
onOptionsItemSelected(item);
}
...
}
Основное меню:
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >
<item android:id="@+id/menu_item_send"
android:icon="@drawable/ic_send"
android:title="send"
app:showAsAction="ifRoom"/>
<item android:id="@+id/menu_item_location"
android:icon="@drawable/ic_location_on"
android:title="my position"
app:showAsAction="ifRoom"/>
<item android:id="@+id/menu_item_map_type"
android:icon="@drawable/ic_map"
android:title="map view"
app:showAsAction="ifRoom"/>
</menu>
всплывающее меню:
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" >
<item
android:id="@+id/menu_item_satellite"
android:title="satellite"
android:checkable="true"
android:onClick="callOnOptionsItemSelected"/>
<item
android:id="@+id/menu_item_street"
android:title="street"
android:checkable="true"
android:onClick="callOnOptionsItemSelected" />
</menu>
Мое временное решение является определение метода callOnOptionsItemSelected()
, который называет метод onOptionsItemSelected()
. Кстати, я хотел бы знать, чего мне не хватает.
(Другой вопрос, связанный с всплывающим окном, что метод setChecked()
класса MenuItem
, не работает.)
Возможно, проблема в том, что вы не проверяете, является ли элемент вашей кнопкой (item.getItemId() == R.id.sat), затем выполните item.setChecked (true), а затем верните true. В приведенном ниже учебном пособии говорится, что «Когда вы успешно обрабатываете элемент меню, возвращайте true. Если вы не обрабатываете элемент меню, вы должны вызывать реализацию суперкласса onOptionsItemSelected() (реализация по умолчанию возвращает false)». в разделе «Обработка событий кликов». –
@frenk Я запустил ваш тестовый код, а onOptionsItemSelected получил название просто отлично. У вас есть библиотека, которая также использует Log.d? Возможно, вы импортировали неправильный Log.d, и поэтому он не отображается в консоли. – WindsurferOak
Я изменил код, как вы предлагаете, но ничего не изменилось. – optimusfrenk