应该“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; }
- Android设备未连接到USB进行debugging(Android Studio)
- 如何自动启动Android应用程序?
- adb服务器已过期
- Android模拟器:qemu-system-i386.exe:goldfish_battery_read:错误的偏移量
- Android构build失败,build.xml:479:SDK没有安装任何生成工具
- Google云terminal和用户的身份validation
- 在渲染过程中,android studio sdk version 22exception:action_bar
- Android权限:手机通话:读取手机状态和身份
- closures自动提示的EditText?