2

私は実際にAndroidの組み込みの検索インターフェースを使用しようとしていますが、検索クエリでデータを渡そうとするといくつかの問題が発生します。

簡単な説明は次のとおりです。Serializableを実装する「Category」という最初のアクティビティ(FirstActivity)にオブジェクトがあり(すでにアクティビティ間で正常に渡されています)、そのカテゴリに関連する検索を実行して、結果をに表示したいと思います。 2番目のアクティビティ(SecondActivity)。

したがって、FirstActivityでは、onSearchRequestメソッドをオーバーライドします。

@Override
public boolean onSearchRequested() {
    Bundle appData = new Bundle();
    appData.putSerializable("category", _currentCategory);
    Log.d(Utils.LOG_TAG, "Bundle : "+appData.keySet());
    startSearch(null, false, appData, false);
    return true;
}

そしてSecondActivityで、私はこのバンドルを取得しようとします:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    handleIntent(getIntent());
}

private void handleIntent(Intent intent){
    Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);
    if(appData == null) Log.d(Utils.LOG_TAG, "appData == null");
    Log.d(Utils.LOG_TAG, "Extras : "+intent.getExtras().keySet());
}

問題は、appDataが毎回nullに等しいように見えることです。logcatの出力は次のとおりです。

Bundle : [category]
appData == null
Extras : [query, user_query]

他のオブジェクト(ブール値など)をバンドルに追加しようとしましたが、何も変更されず、appDataがnullのままになります。

4

4 に答える 4

3

私もこれを理解するのに問題がありました、そして私が見つけた例は本当に役に立ちませんでした。それらの多くはonSearchRequested()をオーバーライドすることを提案しましたが、それは実際にはSearchWidgetでは機能しません。OnQueryTextListenerを設定するよりもはるかに簡単に思えたので、解決策として次の(danadaから)を使用することになりました。次のように、startActivity(最初の検索アクティビティ)をオーバーライドしました。

@Override
public void startActivity(Intent intent) {      
    //check if search intent
    if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
        intent.putExtra("KEY", "VALUE");
    }

    super.startActivity(intent);
}

次に、2番目の検索可能なアクティビティで、次のような情報を引き出しました(onCreate()から、またはonNewIntent()のオーバーライドから(singleTopを使用している場合)):

private void handleIntent(Intent intent){
    if(Intent.ACTION_SEARCH.equals(intent.getAction())){
    mSearchedQuery = intent.getStringExtra(SearchManager.QUERY);
    mExtraData = intent.getStringExtra("KEY");
}

シンプルで、チャームのように機能しました!それについてもう少し説明が必要な場合は、上記の記事へのリンクを確認してください。

于 2013-09-14T19:10:23.520 に答える
1

SearchViewを使用している場合、は送信されませんappData。代わりに、OnQueryTextListenerの使用を検討してください。例えば:

...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.your-menu-id, menu);

    /*
     * Get the SearchView and set the searchable configuration.
     */
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.your-search-menuitem-id)
            .getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    /*
     * Set query text listener here.
     */
    searchView.setOnQueryTextListener(mSearchViewOnQueryTextListener);

    return true;
}// onCreateOptionsMenu()

...
private final SearchView.OnQueryTextListener mSearchViewOnQueryTextListener = new SearchView.OnQueryTextListener() {

    @Override
    public boolean onQueryTextSubmit(String query) {
        /*
         * You don't need to deal with "appData", because you already
         * have the search query here.
         */

        // Tell the SearchView that we handled the query.
        return true;
    }// onQueryTextSubmit()

    @Override
    public boolean onQueryTextChange(String newText) {
        // TODO Auto-generated method stub
        return false;
    }// onQueryTextChange()
};// mSearchViewOnQueryTextListener

注:古い方法を維持する必要があります(appDatainsideonSearchRequested())。で、onCreate()の追加がでSearchManager.APP_DATAあるnull、それはリスナーで検索クエリをすでに処理したことを意味します。

結論:

  • SearchViewが非アクティブで、を介して呼び出すと、次のようになりますonSearchRequested()onSearchRequested()>> onCreate()ACTION_SEARCH 含む SearchManager.APP_DATA)。
  • SearchViewがアクティブな場合、ユーザーは検索を入力して送信すると、次のようになります: SearchView.OnQueryTextListener.onQueryTextSubmit()>> onCreate()ACTION_SEARCH なし SearchManager.APP_DATA)。
于 2012-11-29T02:15:06.797 に答える
0

データを入れて取得するときは、2つの異なるキーを使用しています。使用している間、および使用している代わりに使用し"category"ている検索中SearchManager.APP_DATA"category"

で試してみてください

Bundle appData = intent.getBundleExtra("category");

ありがとうDeepak

于 2011-06-16T13:26:34.707 に答える
0

この例では、appDataを含むバンドルではなく、元のインテントオブジェクトのキーセットを要求しています。動作するはずの例を次に示します。

private void handleIntent(Intent intent){
    final Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA);

    for (String key : appData.keySet()) {
        Log.d(TAG, "key="+appData.getString(key));
    }
}
于 2012-02-04T00:48:30.690 に答える