2

这个主题可能看起来与其他主题相似,但我还没有找到任何可用的答案。

这就是我想要的:我有一个TabActivity带有菜单的选项卡,其中包含没有任何菜单的选项卡。当我按下菜单按钮时,我希望显示唯一的现有菜单。如果我只给菜单充气,这很好用。但是,如果我想更改菜单的内容(更改onPrepareOptionsMenu(menu)方法中项目的可见性)甚至按下菜单的项目,则没有任何效果。

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

我在调试器中注意到菜单上下文是当前选项卡的活动,因此我将菜单移到了该活动中,但没有取得更多成功。

最后一件事,我在应用程序的早期版本中使用相同的菜单和非常相似的代码,使用单个活动(没有选项卡),我没有遇到任何问题。当我转移到 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 !!),但是它应该返回的值以输入开关/大小写分别是21311652152131165216,所以正如我之前所说,我的项目 ID 有问题。Activity我使用第一个选项卡中的菜单进行了此测试,因为菜单mContext的值始终是当前活动的实例。但是即使上下文和包含菜单的活动相同,它仍然不起作用。

4

1 回答 1

0

所以 !我终于弄清楚出了什么问题。这是一个构建/编译错误。在刷新项目之前我已经尝试了很多次,但是还不够,我还尝试过删除R.java文件(从XML文件中编译ID号的地方),但它仍然不起作用;在另一个项目中工作时,我终于想起了Project -> Clear...Eclipse 中的功能。

它刚刚奏效。所以这并没有什么挑战性,但至少我今天学到了一些有价值的东西。

于 2012-03-28T11:22:58.750 回答