2011-01-26 20 views
2

検索ボタンを押したときにAndroid Searchボックスを表示するMapActivityがあります。 SearchManagerはダイアログを管理し、ユーザのクエリを検索可能なアクティビティに渡します。検索可能なアクティビティはSQLite DBを検索し、カスタムアダプタを使用して結果を表示します。Android onSearchRequested()呼び出しアクティビティへのコールバック

これは問題なく動作し、表示されるDBから正しい結果が得られます。

しかし、私がしたいのは、ユーザーが検索結果をクリックしたときにMapのMapActivityに結果を表示することです。現在、これは新しいMapActivityを開始し、検索結果をバンドルを使用して渡すことを意味します。

新しい検索を開始するのではなく、検索結果を元のアクティビティに戻すのがよりクリーンな方法だと思いました。現時点では、私のアクティビティスタックはMapAct - > SearchManager - > Search Result - > New MapActになります。つまり、新しいMapActから「戻る」を押すと、クエリの結果に戻り、元のMapActに戻ります。

検索結果で、finish()を呼び出しても呼び出し元のMapActivityでonActivityResultが呼び出されないようです。

このコールバックを取得して賢明なアクティビティスタックを維持する方法はありますか?

答えて

5

私はこの正確な質問に対する答えを見つけ出し、最終的には何かを見つけました。私は、元の呼び出し元の活動検索可能な活動をしなければならなかったので、マニフェストの私のエントリは次のようになります。

<activity android:name=".BaseActivity" 
      android:launchMode="singleTop"> 
    <!-- BaseActivity is also the searchable activity --> 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data android:name="android.app.searchable" 
       android:resource="@xml/searchable"/> 
    <!-- enable the base activity to send searches to itself --> 
    <meta-data android:name="android.app.default_searchable" 
       android:value=".BaseActivity" /> 
</activity> 

とし、代わりに、実際の検索アクティビティを使って手動で、この活動にstartActivityForResultを検索するのでは、どのsetResultfinishを元の呼び出しアクティビティに戻すことができます。

blog post hereで少し詳しく説明しました。

1

私は最後に、これにはsingleTopを含まない解決策を発見しました。そのフラグがある場合

@Override 
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) { 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     int flags = intent.getFlags(); 
     // We have to clear this bit (which search automatically sets) otherwise startActivityForResult will never work 
     flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK; 
     intent.setFlags(flags); 
     // We override the requestCode (which will be -1 initially) 
     // with a constant of ours. 
     requestCode = AppConstants.ACTION_SEARCH_REQUEST_CODE; 
    } 
    super.startActivityForResult(intent, requestCode, options); 
} 

アンドロイドは常に(何らかの理由で)何らかの理由で、Intent.FLAG_ACTIVITY_NEW_TASKフラグでACTION_SEARCHの意図を開始しますが、:

まず、検索を発信し、あなたの活動に、startActivityForResultを上書き設定すると、onActivityResultは元のタスクで決して(正しく)呼び出されません。

次に、ユーザーが検索可能なアクティビティで、ユーザーがアイテムを選択したときに通常どおりsetResult(Intent.RESULT_OK, resultBundle)を呼び出します。

最後に、あなたはあなたの元の活動にonActivityResult(int requestCode, int resultCode, Intent data)を実装し、resultCodeIntent.RESULT_OKで、requestCodeリクエストコード定数(この場合はAppConstants.ACTION_SEARCH_REQUEST_CODE)であるとき、適切に対応します。

関連する問題