Подтвердить что ты не робот

OnSearchRequested() больше не работает в Android 4.x +?

Мое приложение перехватывает кнопку поиска, чтобы передать что-то более актуальное для самого приложения:

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

Он работал (по-прежнему работает) отлично на всех версиях Android, кроме моего нового телефона 4.1.2: на этом телефоне Android 4.x вызывается то, что называется "Google Now".

Является ли это хорошо известным (то есть документированное изменение)?

Если да, есть ли другой способ "перехватить" кнопку поиска?

Обновление:. Я сделал именно то, что было предложено @daniel_c05 ниже, но прикосновение к кнопке поиска продолжает приносить одно и то же поведение: Приведение активности поиска Google (и приостановка моей собственной деятельности, что явно не является желательным поведение):

enter image description here

Кстати, принятый ответ в этот подобный вопрос неприемлем... так, есть ли другой способ "перехватить" кнопку поиска?

4b9b3361

Ответ 1

Yup, Google угнал кнопку поиска, когда он представил Jelly Bean (Android 4.1), и если вы попытаетесь перехватить его раньше, onKeyDown():

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

Вы поймете, что это тоже не сработает.

Но может быть это обходное решение может вам помочь?

Ответ 2

У меня Galaxy Nexus работает 4.2.1, и у меня нет проблем с помощью 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.