1

我可以使用以下方法禁用上下文菜单中的项目:

menu.getItem(1).setEnabled(false);

在 onCreateContextMenu 中,但是如果我以后想在同一个活动中将其设置为 true 怎么办?我怎么能在运行时做到这一点?

编辑:

        // Create context menu
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    // TODO Auto-generated method stub
    super.onCreateContextMenu(menu, v, menuInfo);

    menu.setHeaderTitle("Options for this image"); // Title for the menu
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.activity_1_menu, menu);

    menu.getItem(1).setEnabled(false);  
}

这是我要更改要启用的项目的地方:

    // Handle return values from different activities
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == Activity.RESULT_OK) {

        if (requestCode == 1) {

            // Get value from intent
            String imageId = data.getExtras().getString("imageId");

            // Show full screen image
            Bitmap bitmap = BitmapFactory.decodeFile(imageId);
            imageView.setImageBitmap(bitmap);
        }

        else if(requestCode == 2) {
            String contact1 = data.getExtras().getString("contactName");
            String contact2 = data.getExtras().getString("test");
            Toast.makeText(Activity_1.this, "" + "Value from activity 3: " + contact1 + " " + contact2, Toast.LENGTH_SHORT).show();


 CHANGE MENU ITEM 1 TO ENABLE HERE!!!!

        }
    }
}

}

4

4 回答 4

1

与选项菜单相反,您需要在onPrepareOptionsMenu每次显示菜单时添加菜单特定代码的方法,您可以在onCreateContextMenu上下文菜单中执行此操作。onCreateContextMenu每次菜单要在屏幕上显示时调用。

因此,只需将菜单的启用状态存储在某处,并使用此变量在onCreateContextMenu方法中相应地设置启用状态。对于您的示例,这看起来像

boolean menuItem1EnabledState = false;

// Create context menu
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    // TODO Auto-generated method stub
    super.onCreateContextMenu(menu, v, menuInfo);

    menu.setHeaderTitle("Options for this image"); // Title for the menu
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.activity_1_menu, menu);

    menu.getItem(1).setEnabled(menuItem1EnabledState);  
}


// Handle return values from different activities
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == Activity.RESULT_OK) {

        if (requestCode == 1) {

            // Get value from intent
            String imageId = data.getExtras().getString("imageId");

            // Show full screen image
            Bitmap bitmap = BitmapFactory.decodeFile(imageId);
            imageView.setImageBitmap(bitmap);
        }

        else if(requestCode == 2) {
            String contact1 = data.getExtras().getString("contactName");
            String contact2 = data.getExtras().getString("test");
            Toast.makeText(Activity_1.this, "" + "Value from activity 3: " + contact1 + " " + contact2, Toast.LENGTH_SHORT).show();

            menuItem1EnabledState = true;

        }
    }
}
于 2015-02-17T16:24:17.150 回答
0

使用 onPrepareOptionsMenu

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    menu.getItem(1).setEnabled(true);
    return true;
}

此外,在 Android 3.0 及更高版本上,您必须在要更新菜单时调用 invalidateOptionsMenu(),因为菜单始终处于打开状态。然后系统将调用 onPrepareOptionsMenu() 以便您可以更新菜单项。

于 2013-02-26T10:48:10.373 回答
0

您应该编写代码以启用/禁用onPrepareOptionsMenu中的选项菜单,如此处明确提到

@Override
    public boolean onPrepareOptionsMenu(Menu menu)
    {
        super.onPrepareOptionsMenu(menu);
        if (yourConditionIsSatisfied)
        {
            menu.getItem(1).setEnabled(true);
        } else
        {
            menu.getItem(1).setEnabled(false);
        }
        return true;
    }

在预蜂窝中,您只需要更改yourConditionIsSatisfiedas的值即可true/false。您不必担心它是否会被触发,因为当您单击选项按钮时总是会触发onPrepareOptionsMenu()但如果是更高版本的操作系统,您需要调用invalidateOptionsMenu()invalidateOptionsMenu()将反过来触发onPrepareOptionsMenu(). 根据您给出的代码,您应该编写以下代码

protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if (resultCode == Activity.RESULT_OK)
        {

            if (requestCode == 1)
            {
                // Get value from intent
                String imageId = data.getExtras().getString("imageId");
                // Show full screen image
                Bitmap bitmap = BitmapFactory.decodeFile(imageId);
                imageView.setImageBitmap(bitmap);
                // Add new menu item for context menu of the imageview
                // Write
            } else if (requestCode == 2)
            {
                String contact1 = data.getExtras().getString("contactName");
                String contact2 = data.getExtras().getString("test");
                Toast.makeText(Activity_1.this, "" + "Value from activity 3: " + contact1 + " " + contact2, Toast.LENGTH_SHORT).show();
                conditionSatisfied = true;
                invalidateOptionsMenu();
            }
        }
    }



@Override
    public boolean onPrepareOptionsMenu(Menu menu)
    {
        super.onPrepareOptionsMenu(menu);
        if (conditionSatisfied)
        {
            menu.getItem(1).setEnabled(true);
        } else
        {
            menu.getItem(1).setEnabled(false);
        }
        return true;
    }
于 2013-02-26T10:38:54.063 回答
0

您可以在此处查看链接以获取正确的信息。基本上是代码片段

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    MenuItem item = menu.findItem(R.id.menu_my_item);

    if (myItemShouldBeEnabled) {
        item.setEnabled(true);
        item.getIcon().setAlpha(255);
    } else {
        // disabled
        item.setEnabled(false);
        item.getIcon().setAlpha(130);
    }
}

使图标有点时尚。

享受你的代码:)

于 2015-10-09T13:26:17.463 回答