我的应用程序拦截搜索按钮以提供与应用程序本身更相关的内容:
@Override
public boolean onSearchRequested() {
if (isOkToSearchWithinTheApp())
doRelevantOwnSearch();
return true;
}
除了我的新4.1.2手机外,它在所有Android版本上都运行良好(仍然有效):在这款Android 4.x手机上,会调用“Google Now”这个名称。
这是众所周知的(即记录在案的变更)吗?
如果是这样,有没有其他方法可以“拦截”搜索按钮?
更新:我完全按照以下@ daniel_c05的建议完成,但触摸搜索按钮会产生相同的行为:带来Google搜索活动(并暂停我自己的活动,这显然不是理想的行为):
顺便说一句,this similar question中接受的答案是不可接受的......那么,有没有其他方法可以“拦截”搜索按钮?
答案 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。