如何使用TabActivity菜单而不干扰子选项卡

时间:2012-03-22 07:23:02

标签: android android-menu android-tabactivity

此主题看起来与其他主题类似,但我没有找到任何可用的答案。

这就是我想要的:我有一个带有菜单的TabActivity,其中包含没有任何菜单的标签。当我按下菜单按钮时,我想要显示唯一的现有菜单。如果我只是膨胀菜单,这工作正常。但是,如果我想更改菜单内容(更改onPrepareOptionsMenu(menu)方法中项目的可见性),或者甚至按菜单项,则无效。

对于onPrepareOptionsMenu(menu),问题似乎来自返回null对象的menu.findItem(...)方法,我有一个NullPointerException! 在onOptionsItemSelected(item)中,不会识别任何商品ID。

我已经注意到调试器菜单Context是当前选项卡的活动,所以我已经移动了该活动的菜单,但没有更多的成功。

最后,我在应用程序的先前版本中使用相同的菜单和非常相似的代码,使用单个活动(没有选项卡),我没有遇到任何问题。当我转向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的ID !!),但它应返回进入开关/案例的值分别为 2131165215 2131165216 ,因此我之前说过,我的项目ID有问题。我使用第一个标签的Activity内的菜单进行了此测试,因为菜单mContext值始终是当前活动的一个实例。但即使Context和包含菜单的Activity相同,它仍然无效。

1 个答案:

答案 0 :(得分:0)

所以!我终于弄清楚出了什么问题。这是一个建筑/编译错误。我多次尝试刷新项目之前一直在尝试,但这还不够,我还尝试删除R.java文件(从XML文件中编译ID编号),但它仍然无效;我在处理另一个项目时终于想起了Eclipse中的Project -> Clear...函数。

它刚刚起作用。所以这没什么大不了的,但至少我今天学到了很多有价值的东西。