【问题标题】:onSearchRequested() no longer works in Android 4.x+?onSearchRequested() 不再适用于 Android 4.x+?
【发布时间】:2012-12-23 20:02:30
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • @A--C 根本不是重复的。 :) 注意内容,看到这两个问题是在谈论两个不同的事情。但是感谢您的链接!
  • 但它仍然是重复的。
  • 不能接受,只是因为不能接受。这并没有错。我 6 岁的孩子会争辩说睡觉时间是不可接受的;)
  • @Geobits 你是对的。我很难相信没有办法恢复我们在 Android 1.x、2.x 和 3.x 中如此依赖的行为。我非常愿意使用一个无证的把戏。我只想找回我的搜索按钮。就像一个6岁的孩子。 :)

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


【解决方案1】:

是的,谷歌在推出 Jelly Bean (Android 4.1) 时劫持了搜索按钮,如果你想早点拦截它,onKeyDown()

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

你会发现它也行不通。

但也许this workaround 可以帮助你?

【讨论】:

  • 抱歉,您建议的解决方法是针对用户的。我需要 programmatic 解决方案。仍在寻找解决方案。
【解决方案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。

【讨论】:

  • 对不起。我尝试了您的解决方案,Android 4.1 上的搜索按钮仍然产生 Google 搜索,而不是让我的应用通过 onKeyDown(和 android.intent.action.SEARCH 过滤器)处理这个问题。
  • 澄清:当用户触摸搜索按钮时,我不希望正在运行的应用程序中出现 searchWidget 或任何其他视觉变化。我想要的只是在我已经活跃的活动中调用特定方法。在 Android 4.1 之前,覆盖 onSearchRequested() 为我提供了这一点。但是在这一点上,我不介意将该方法称为其他名称。我只需要在用户触摸搜索按钮时调用一些回调/方法。我会从那里拿走它。想法?
  • 覆盖 onKeyDown() 而不是 onSearchRequested()。如果 (keycode == KeyEvent.KEYCODE_SEARCH) 则执行您的操作并返回 true,这样事件就不会传播。否则返回超级。 onKeyDown(keycode, event);
  • @daniel_c05 我相信 OP 已经说过他尝试覆盖 onKeyDown() (在另一个答案中也有建议)。看起来他的问题没有解决方案(他描述的方式)。
猜你喜欢
  • 2017-02-08
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多