如何在contextmenu中启用/禁用项目

时间:2013-02-26 10:35:20

标签: android

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

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 个答案:

答案 0 :(得分:0)

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

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

在预蜂窝中,您只需要将yourConditionIsSatisfied的值更改为true/false,而不是其他任何内容。您无需担心是否会被触发,因为单击选项按钮时onPrepareOptionsMenu() 始终会被触发。但是如果OS的更高版本需要调用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;
    }

答案 1 :(得分:0)

使用onPrepareOptionsMenu

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

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

答案 2 :(得分:0)

与需要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;

        }
    }
}

答案 3 :(得分:0)

您可以在此处link查看相关信息。 基本上代码sniipet

@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);
    }
}

使图标有点时尚。

享受您的代码:)