在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之间有什么区别?
答案 0 :(得分:49)
kleaver,
的文档返回
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()
方法,直到它结束所有片段或某人消耗它。
这里我试图从图解释
绿色边界是片段-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);
}