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

そうです、Google は Jelly Bean (Android 4.1) を導入したときに検索ボタンをハイジャックしまし

...
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 がある場合は自動的に読み込まれ、ユーザーの入力を待っているだけです。onNewIntentsearchable.xml の動作に応じて、Action.Search または Action.View を介して検索を処理するためにオーバーライドする必要があります。

編集

OK、私にお願いして、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 を呼び出さないことを確認してください。

于 2013-02-27T03:47:33.263 に答える