我在ActionBar子菜单中有一些项目,我想有条件地禁用它们,因为它们不适用于某些上下文。我希望它们显示为禁用(灰色)以阻止用户点击它们;但是,如果点击,我想显示一个祝酒词告诉用户它为什么被禁用(“不能做A,因为没有B”等)。但是,如果我调用MenuItem.setEnabled(false),似乎所有菜单项单击事件都不会发生。那么,如何检测单击禁用的菜单项?
public class Temp extends Activity implements OnMenuItemClickListener
{
boolean mConditional = true;
protected void onCreate(Bundle state)
{
super.onCreate(state);
}
public boolean onMenuOpened(int featureId, Menu menu)
{
MenuItem item = (MenuItem) menu.findItem(R.id.item2);
if(item != null && mConditional)
{
item.setEnabled(false);
item.setOnMenuItemClickListener(this);
}
return super.onMenuOpened(featureId, menu);
}
@Override
public boolean onMenuItemClick(MenuItem item)
{
//does not fire if item is disabled
Log.e("", item.getTitle().toString());
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
//does not fire if item is disabled
Log.e("", item.getTitle().toString());
return super.onOptionsItemSelected(item);
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item)
{
//does not fire if item is disabled
Log.e("", item.getTitle().toString());
return super.onMenuItemSelected(featureId, item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return true;
}
}
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu"
android:icon="@drawable/ic_launcher"
android:showAsAction="always"
android:title="menu">
<menu>
<item
android:id="@+id/item1"
android:showAsAction="always"
android:title="item 1"/>
<item
android:id="@+id/item2"
android:showAsAction="always"
android:title="item 2"/>
<item
android:id="@+id/item3"
android:showAsAction="always"
android:title="item 3"/>
</menu>
</item>
</menu>
答案 0 :(得分:2)
您无法使用setEnabled
。您需要始终启用菜单项并通过更改drawable(或使用porterduff过滤器修改它来模拟“禁用”状态 - 查看如何在android中调暗图像的this question)。另外,您需要保留一个标志,指示项目的状态 - 菜单项的tag
是一个不错的选择。理想情况下,你会有这样的事情:
private void setMenuItemEnable(MenuItem item, boolean enabled) {
int curstate = ((Integer)item.getTag()).intValue();
if(curState == 1 && enabled || curstate == 0 && !enabled) {
return;
}
if(enabled) {
... //update image to remove dimming
item.setTag(1);
}
else {
... //update image by dimming it
item.setTag(0);
}
}
最后,在您的onOptionsItemSelected()
方法中,检查所选菜单项的标记,如果标记为1,则执行操作;如果标记为0,则显示toast。视觉上它将是您想要的,从功能上来说,它会做你想要的事情。