Android onSearchRequested () обратный вызов для вызова деятельности - PullRequest
2 голосов
/ 26 января 2011

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

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

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

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

Кажется, что в результате поиска при вызове finish () не вызывается вызов onActivityResult ввызывающий MapActivity.

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

Ответы [ 2 ]

5 голосов
/ 11 мая 2011

Я искал ответ на этот точный вопрос и наконец нашел то, что работает.Мне нужно было сделать исходное действие вызова также поисковым действием, поэтому моя запись в манифесте выглядит следующим образом:

<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 вернуться к исходной активности по вызову.

Я попал в более подробное описание в блоге здесь .

2 голосов
/ 06 июля 2017

Я наконец-то нашел решение для этого, которое не включает 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, но если этот флаг установлен, onActivityResult никогда не будет (правильно) вызываться в исходной задаче.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...