onSearchRequested()在Android 4.x +中不再有效?

时间:2012-12-23 20:02:31

标签: android android-4.0-ice-cream-sandwich

我的应用程序拦截搜索按钮以提供与应用程序本身更相关的内容:

  @Override
  public boolean onSearchRequested() {
    if (isOkToSearchWithinTheApp())
      doRelevantOwnSearch();
    return true; 
  }

除了我的新4.1.2手机外,它在所有Android版本上都运行良好(仍然有效):在这款Android 4.x手机上,会调用“Google Now”这个名称。

这是众所周知的(即记录在案的变更)吗?

如果是这样,有没有其他方法可以“拦截”搜索按钮?

更新:我完全按照以下@ daniel_c05的建议完成,但触摸搜索按钮会产生相同的行为:带来Google搜索活动(并暂停我自己的活动,这显然不是理想的行为):

enter image description here

顺便说一句,this similar question中接受的答案是不可接受的......那么,有没有其他方法可以“拦截”搜索按钮?

2 个答案:

答案 0 :(得分:10)

是的,谷歌在推出Jelly Bean(Android 4.1)时劫持了搜索按钮,如果你之前尝试拦截它,请onKeyDown()

...
else if (keyCode == KeyEvent.KEYCODE_SEARCH) {
  return this.onSearchRequested();
}

你会意识到它也不起作用。

但也许this workaround可以帮到你?

答案 1 :(得分:2)

我有一个运行4.2.1的Galaxy Nexus,我使用oonSearchRequested

没有问题

需要考虑的一些事项:

1 - 确保在清单中声明可搜索的活动实际上是可搜索的,并确保添加搜索意图过滤器以捕获onSearchRequested:

  <activity
        android:name="com.lazybits.rae.movil.Results"
        android:label="@string/title_activity_results"
        android:launchMode="singleTask"
        android:parentActivityName="com.lazybits.rae.movil.Home" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>

2 - 覆盖onKeyDown()以建立正确的搜索界面:

 @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {     

    if ((keyCode == KeyEvent.KEYCODE_SEARCH) && isOkToSearchWithinTheApp) {
        onSearchRequested();
        return true;
        }
    return super.onKeyDown(keyCode, event);
    }

此时如果你有一个searchWidget,它应该自动加载,你现在只是在等待用户输入。您可能希望覆盖onNewIntent以通过Action.Search或Action.View处理搜索,具体取决于您的searchable.xml行为。

修改

好的,你可以帮我一个忙,只是尝试覆盖onKeyDown,但不要在其中加入任何代码,如下所示:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {     

    if (keyCode == KeyEvent.KEYCODE_SEARCH) {
            //do nothing, simply return true to avoid regular behavious
            return true;
        }
    }

我想测试的是,看看是否会阻止Google现在出现,这应该绝对没有。如果可行,那么之后您可以添加代码,只需确保返回true(以避免事件进一步传播),并且不调用onSearchRequested。