25

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

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

除了在我的新 4.1.2 手机上之外,它在所有 Android 版本上(仍然有效)都很好用:在这款 Android 4.x 手机上,它自己调用了名为“Google Now”的东西。

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

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

更新:我完全按照下面@daniel_c05 的建议做了,但触摸搜索按钮仍然产生相同的行为:带来谷歌搜索活动(并暂停我自己的活动,这显然不是所需的行为):

在此处输入图像描述

顺便说一句,在这个类似问题中接受的答案是不可接受的......那么,有没有其他方法可以“拦截”搜索按钮?

4

2 回答 2

10

是的,谷歌在引入 Jelly Bean (Android 4.1) 时劫持了搜索按钮,如果你试图更早地拦截它,在onKeyDown()中:

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

你会发现它也行不通。

但也许这种解决方法可以帮助你?

于 2012-12-23T21:43:05.307 回答
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根据您的 searchable.xml 行为覆盖通过 Action.Search 或 Action.View 处理搜索。

编辑

好的,你能帮我一个忙,简单地尝试覆盖 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;
        }
    }

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

于 2013-02-27T03:47:33.263 回答