Как использовать TabActivity Menu без вмешательства в дочерние вкладки - PullRequest
2 голосов
/ 22 марта 2012

Эта тема может выглядеть аналогично другим, но я не нашел подходящего ответа для этого случая.

Вот что я хочу: у меня есть TabActivity с меню, содержащим вкладки без меню,Когда я нажимаю кнопку меню, я хочу, чтобы отображалось только существующее меню.Если я только раздуваю меню, это работает нормально.Но если я хочу изменить содержимое меню (изменить видимость элементов в методе onPrepareOptionsMenu(menu)) или даже нажать элементы меню, ничего не работает.

Для onPrepareOptionsMenu(menu) проблемаПохоже, что это происходит из menu.findItem(...) метода, который возвращает нулевой объект, и у меня есть NullPointerExceptiononOptionsItemSelected(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 меню всегда является экземпляром текущей операции.Но хотя контекст и действие, содержащее меню, одинаковы, оно все равно не работает.

1 Ответ

0 голосов
/ 28 марта 2012

Итак!Я наконец понял, что случилось.Это была ошибка сборки / компиляции.Я пытался до обновления проекта много раз, но этого было недостаточно, я также пытался удалить файл R.java (где компилируются идентификационные номера из файлов XML), но он все еще не работал;и я наконец вспомнил о функции Project -> Clear... в Eclipse во время работы над другим проектом.

И это просто сработало.Так что ничего сложного там не было, но, по крайней мере, сегодня я узнал кое-что ценное.

...