【发布时间】:2012-09-13 23:18:03
【问题描述】:
我想有条件地禁用 ActionBar 子菜单中的一些项目,因为它们不适用于某些上下文。我希望它们显示为禁用(灰色)以阻止用户点击它们;但是如果单击,我想显示一个 toast 通知用户为什么它被禁用(“不能做 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>
【问题讨论】:
-
您无法点击已禁用的 MenuItem。
-
为什么不根据变量改变文本颜色和按钮操作?不要禁用它
-
@mario 关于如何更改 MenuItem 的文本颜色有什么建议吗?
-
简单搜索一下SO就可以找到一些答案,stackoverflow.com/questions/3519277/…
-
@mario 这个解决方案会改变所有菜单项的外观,而且对于多个操作系统版本也不是特别安全。
标签: android