1

一部のコンテキストには適用できないため、条件付きで無効にしたい ActionBar サブメニューにいくつかの項目があります。ユーザーがクリックするのを思いとどまらせるために、それらを無効 (グレー表示) にしたいと思います。しかし、クリックすると、無効になっている理由をユーザーに通知するトーストを表示したいと思います(「Bがないため、Aを実行できません」など)。ただし、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>
4

1 に答える 1

3

これには使用できませんsetEnabled。メニュー項目を常に有効にし、ドローアブルを変更して「無効」状態をシミュレートする必要があります (または porterduff フィルターを使用して変更します - 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 の場合はトーストを表示します。あなたは後です。

于 2012-09-13T15:18:03.013 に答える