2013-02-26 93 views
1

/禁用的项目,我可以在此通过ContextMenu禁用的项目:在onCreateContextMenu,如果我有什么如何启用的ContextMenu

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

,但后来想用同样的活动中设置为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!!!! 

     } 
    } 
} 

}

回答

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 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; 
    } 
+0

感谢您的回复!我已经多次阅读过这个页面,但是我没有得到它,我应该放置onPrepareOptionsMenu方法来让它工作!?我想这是要求菜单对象 – 2013-02-26 10:43:30

+0

onPrepareOptionsMenu()可以放置在您的活动中的任何位置,它将自动调用,就像onCreateContextMenu在上下文选项即将显示时自动调用一样。 – Antrromet 2013-02-26 11:17:19

+0

是的,但是如何在运行时更改要启用的项目? – 2013-02-26 11:20:52

0

使用onPrepareOptionsMenu

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

同样适用于Android 3.0及更高版本,您必须调用invalidateOptionsMenu()当您要更新的菜单,因为该菜单始终打开。系统然后会调用onPrepareOptionsMenu(),以便更新菜单项。

+0

好的,但我不知道如何调用这个方法,并且能够在运行时传递Menu对象?我想要启用菜单项。 – 2013-02-26 10:51:35

+0

你将重写活动方法不需要调用它会自动调用...并在Android 3.0或更高版本中调用invalidateOptionsMenu当你想更新菜单..并启用项目调用setEnabled(true)on menuitem – baboo 2013-02-26 11:03:06

+0

嗯!你可以善良,只需添加一些代码?我理解起来更容易。我使用的是运行在2.3.6中的设备,但我希望代码也能在更高版本上运行。如果在版本3.0和更高版本中使用此方法,是否需要检查版本?请添加一些代码以更好地理解!谢谢! :) – 2013-02-26 11:18:52

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; 

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

使得图标点点时尚。

享受您的代码:)