Эта тема может выглядеть аналогично другим, но я не нашел подходящего ответа для этого случая.
Вот что я хочу: у меня есть TabActivity
с меню, содержащим вкладки без меню,Когда я нажимаю кнопку меню, я хочу, чтобы отображалось только существующее меню.Если я только раздуваю меню, это работает нормально.Но если я хочу изменить содержимое меню (изменить видимость элементов в методе onPrepareOptionsMenu(menu)
) или даже нажать элементы меню, ничего не работает.
Для onPrepareOptionsMenu(menu)
проблемаПохоже, что это происходит из menu.findItem(...)
метода, который возвращает нулевой объект, и у меня есть NullPointerException
!В onOptionsItemSelected(item)
ни один из идентификаторов элементов не будет распознан.
Я заметил с отладчиком, что контекстное меню - это действие текущей вкладки, поэтому вместо этого я переместил меню внутри этого действия,но без особого успеха.
Последнее, я использовал то же самое меню и очень похожий код в предыдущей версии приложения, используя одно действие (без вкладок), и у меня не возникло никаких проблем.Когда я перешел к дизайну TabActivity, он сначала работал нормально (возможно, контекстом меню был мой TabActivity
вместо Activity
вкладки), но он больше не работал после незначительных изменений в Действияхвкладки (ничего не относящиеся к какому-либо меню).
Если вы думаете, что с помощью ActionBar
(и пакета поддержки) это можно исправить, я уже планирую перейти к нему позже, но я хотел бы понять и исправитьэто первое.
Вот код:
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
MenuItem connect1 = menu.findItem(R.id.connect_1);
MenuItem connect2 = menu.findItem(R.id.connect_2);
// Here I do some stuff to prepare the menu, which could be simplified
// like this :
if (device1Connected)
if (!connect1.isVisible()) // here I get the NullPointerException
connect1.setVisible(true);
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// Handle item selection
switch (item.getItemId()) {
case R.id.select_device:
// do some stuff
return true;
case R.id.connect_1:
// do some stuff
return true;
case R.id.connect_2:
// do some stuff
return true;
case R.id.disconnect:
// do some stuff
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Вот XML-файл меню, ничего особенного
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/select_device"
android:icon="@drawable/icon"
android:title="@string/choose_devices"/>
<item android:id="@+id/connect_1"
android:icon="@android:drawable/ic_menu_add"
android:title="@string/connect_1" />
<item android:id="@+id/connect_2"
android:icon="@android:drawable/ic_menu_add"
android:title="@string/connect_2" />
<item android:id="@+id/disconnect"
android:icon="@android:drawable/ic_menu_close_clear_cancel"
android:title="@string/disconnect" />
</menu>
Редактировать: Я добавил следующее в onPrepareOptionsMenu(menu)
, чтобы избежать исключения NullPointerException.Это не решает реальную проблему, но теперь я точно вижу, что происходит, когда я нажимаю MenuItem
if (connect1 == null || connect2 == null)
return super.onPrepareOptionsMenu(menu);
Когда я нажимаю на первый элемент, getItemId()
возвращает, например, 2131165207 , и второй элемент возвращает 2131165208 (я проверил, это идентификаторы Views
второй вкладки !!), но значения, которые он должен вернуть, чтобы ввести переключатель /case соответственно 2131165215 и 2131165216 , поэтому, как я уже говорил, у меня проблема с идентификаторами предметов.Я сделал этот тест с меню в Activity
первой вкладки, потому что значение mContext
меню всегда является экземпляром текущей операции.Но хотя контекст и действие, содержащее меню, одинаковы, оно все равно не работает.