2011-01-26 3 views
2

У меня есть MapActivity, который отобразит окно Android Search при нажатии кнопки поиска. SearchManager управляет диалоговым окном и передает запрос пользователя на операцию поиска, которая ищет SQLite DB и отображает результаты с помощью пользовательского адаптера.Android onSearchRequested() обратный вызов вызывающей активности

Это прекрасно работает - и я получаю правильные результаты от отображаемой БД.

Однако, что я хочу сделать, это отобразить результат в MapActivity на карте, когда пользователь нажимает на результат поиска. В настоящее время это означает запуск новой MapActivity, передача результата поиска с использованием Bundle.

Я бы подумал, что более чистым способом было бы вернуть результат поиска к первоначальной деятельности, а не начинать новую. На данный момент мой стек активности идет MapAct -> SearchManager -> Результат поиска -> Новый MapAct. Это означает, что нажатие «назад» из нового MapAct вернется к результатам запроса, а затем к исходному MapAct.

Похоже, что в результате поиска вызов функции finish() не вызывает onActivityResult для вызова в вызывающем MapActivity.

Любые идеи, как получить этот обратный вызов и поддерживать разумный стек действий?

ответ

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 с реальным поисковой деятельностью, которая затем разрешит вам setResult и finish обратно к первоначальной вызывающей деятельности.

Я подробно рассмотрел в blog post here.

1

Наконец-то я нашел решение, которое не включает singleTop.

Во-первых, в своей деятельности, которая берет свое начало поиска, переопределить startActivityForResult:

@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); 
} 

Android будет всегда (по некоторым причинам) начать ACTION_SEARCH намерение с Intent.FLAG_ACTIVITY_NEW_TASK флагом, по какой-то причине, но если этот флаг set, onActivityResult никогда не будет (правильно) вызван в вашей исходной задаче.

Далее, в вашей поисковой операции вы просто вызываете setResult(Intent.RESULT_OK, resultBundle), как обычно, когда пользователь выбирает элемент.

Наконец, вы реализуете onActivityResult(int requestCode, int resultCode, Intent data) в вашей инициирующей деятельности и соответствующим образом реагировать, когда resultCode является Intent.RESULT_OK и requestCode Ваш запрос постоянный код (AppConstants.ACTION_SEARCH_REQUEST_CODE в данном случае).

Смежные вопросы