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

在onOptionsItemSelected中…我看到了一些代码在开关块中是不同的。

情况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有什么区别?

kleaver,

根据onOptionsItemSelected()的文档

返回

boolean返回false以允许正常的菜单处理继续,如果在这里使用true。

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

您的方法仍然可以工作,但可能会导致对其他function的不必要的调用。 这个ID最终会落在这些函数上,因为没有任何转换来捕捉它,但是返回false是更正确的。

根据文件
true – >事件在这里消耗,现在不应该为其他事件转发
– >转发其他事件消耗

当我们使用多个片段并且每个片段都有自己的Options菜单并重写OnOptionItemSelected(主要在平板电脑devise中)时,这种布尔返回types实际上是有好处的。

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

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

在这里输入图像说明

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

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

如果任何一个片段正在消耗事件onOptionsItemSelected,则返回true,这样就不会尝试其他片段,我们可以减lessAndroid操作系统的开销。

你的方法的问题是你返回true,即使你的switch语句没有find一个项目。 如果您立即返回true,就像每个开关盒的其他方法一样,那么您可以假设,如果您在方法的末尾没有find开关盒,则返回false以表明它没有被处理。

当我使用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); } 

我刚刚遇到了我的问题

 getActionBar().setDisplayHomeAsUpEnabled(true); 

不工作。 当触摸后退button时,它会突出显示,但没有发生任何事情。

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

在我看来,减less代码重复的最佳解决scheme如下:

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