应该“android:onOptionsItemSelected”返回true或false

时间:2011-04-19 16:03:33

标签: android

在onOptionsItemSelected中...我看到了一些在switch块中不同的代码。

案例1(通常看到)

public boolean onOptionsItemSelected (MenueItem item)
       switch (item.getItemId()){
             case R.id.item1:
             startActivity (new Intent (this, PrefsActivity.class));
             break;
       }
       return true

案例2(不确定为何以这种方式设置)

public boolean onOptionsItemSelected(MenuItem item) {
       switch (item.getItemId()) {
               case MENU_NEW_GAME:
               newGame();
               return true;
       }
       return false;

我的问题

案例1和案例2之间有什么区别?

5 个答案:

答案 0 :(得分:49)

kleaver,

根据onOptionsItemSelected()

的文档
  

返回

     

boolean返回false以允许正常   菜单处理继续,真实   在这里消费。

如果返回true,则onOptionsItemSelect()调用将使用click事件,并且不会落入其他项目单击函数。如果您返回false,则可以在其他项目选择功能中检查事件的ID。

您的方法仍然有效,但可能导致对其他功能的不必要调用。该ID最终会通过这些函数掉落,因为没有切换来捕获它,但返回false更正确。

答案 1 :(得分:32)

根据documentation
       true - >此处消耗的事件,现在不应转发其他事件       
false - >转发其他事件消费

当我们处理多个片段并且每个片段都有自己的Options菜单并覆盖OnOptionItemSelected(主要是在平板电脑设计中)时,这个布尔返回类型实际上有好处。

在这种情况下,android跟踪每个片段的OnOptionItemSelected()方法,以避免这种情况

a)如果任何片段在 onOptionsItemSelected()中消耗事件,则返回" true"(停止)否则返回" false"    
b)如果我们返回false,那么它将跟踪其他连接片段的 onOptionsItemSelected()
方法,直到它结束所有片段或某人消耗它。

enter image description here

这里我试图从图解释
绿色边界是片段-1,红色边界是片段-2
这两个片段都有自己的Optionmenu ,我已经强调了这一点

现在如果我们点击OptionmenuItem中的任何一个,它将检查两个片段中onOptionsItemSelected()的实现

如果任何片段消耗事件onOptionsItemSelected 返回true,那么它永远不会尝试其他片段,我们可以减少Android操作系统的开销。

答案 2 :(得分:1)

您的方法的问题是,即使您的switch语句找不到项目,也会返回true。如果你像每个switch case的其他方法一样立即返回true,那么你可以假设,如果你在方法的最后,没有找到switch case,那么返回false表示它没有被处理。

答案 3 :(得分:1)

我刚遇到了问题

getActionBar().setDisplayHomeAsUpEnabled(true);

无效。当触摸后退按钮时,它会突出显示但没有任何反复发生。

我花了一段时间才发现这是真实的回归。

在我看来,代码重复较少的最佳解决方案如下:

public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
       case MENU_NEW_GAME:
           newGame();
           break;
       default:
           return false;
   }
   return true;
}

答案 4 :(得分:1)

当我使用Android Studio生成通用应用程序时,onOptionsItemSelected()的模板代码会返回true,否则会将调用传递给超类。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_mymenuaction) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}