此主题看起来与其他主题类似,但我没有找到任何可用的答案。
这就是我想要的:我有一个带有菜单的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相同,它仍然无效。
答案 0 :(得分:0)
所以!我终于弄清楚出了什么问题。这是一个建筑/编译错误。我多次尝试刷新项目之前一直在尝试,但这还不够,我还尝试删除R.java
文件(从XML文件中编译ID编号),但它仍然无效;我在处理另一个项目时终于想起了Eclipse中的Project -> Clear...
函数。
它刚刚起作用。所以这没什么大不了的,但至少我今天学到了很多有价值的东西。