【问题标题】:Android: how to detect click on disabled menu item?Android:如何检测禁用菜单项的点击?
【发布时间】: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


【解决方案1】:

您不能为此使用setEnabled。您需要始终启用菜单项并通过更改可绘制对象来模拟“禁用”状态(或使用 porterduff 过滤器对其进行修改 - 请查看this question,了解如何在 android 中使图像变暗)。另外,您需要保留一个指示项目状态的标志 - 菜单项的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。从视觉上看,这正是您想要的,并且从功能上讲,它会做你所追求的。

【讨论】:

  • 关于如何使菜单项变暗的任何其他建议?如上图所示,MenuItem 只是文本,MenuItem 类没有公开 setTextColor 或任何类似方法。此外,即使我能够模拟禁用外观,我也会担心不同的操作系统版本会使用不同的禁用外观,因此我的硬编码禁用外观不太可能与系统通常使用的外观相匹配?
  • @ab11 没有别的办法。您不能禁用该项目,因为这样您就不会收到“点击”事件。您可以使用android.R.style 常量来模拟禁用状态以匹配整体操作系统外观
猜你喜欢
  • 2016-02-08
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2012-03-11
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多