Android finishActivity всегда вызывает onActivityResult для получения RESULT_CANCELED - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть основной вид деятельности A, который может запускать подэтапы B, C или D. Я запускаю их с помощью startActivityForResult (newIntent, REQUEST_CODE);

Пользователь может выбирать между B, Cи D один раз отображается.Деятельность A управляет этой навигацией.Когда они выбирают своп между экранами 'A', сначала вызывается finishActivity (REQUEST_CODE);на отображаемом, а затем вызовите startActivityForResult (newIntent, REQUEST_CODE);для следующего.

В моем onActivityResult у меня есть

    protected void onActivityResult(int requestCode, int resultCode, Intent data)
   {
      // these logs are just for my debugging
      Log.w(this.toString(), "onActivityResult returned to by " + requestCode);
      Log.w(this.toString(), "result code = " + resultCode );

      // the Activity set this value if it was returning normally
      if (RESULT_OK == resultCode)
      {
         Log.i(this.toString(), "---- the sub-activity returned OK ----"); 
         // do some stuff    

      }// end if (RESULT_OK == resultCode)
      // Else we got here because the user hit the back button or something went
      // went wrong (RESULT_CANCELED).  Either way we do not want to display this
      // blank screen to the user.  Take them back to the device connection screen.
      else if (RESULT_CANCELED == resultCode)
      {    
         finish();
      }
    }

По какой-то причине я каждый раз получаю обратно ноль или RESULT_CANCELED, хотя в моих под-действиях B, C, DI устанавливает этот результат только в том случае, если пользователь решает нажать кнопку «Назад» (я отображаю диалоговое окно «Вы уверены», и они выбирают выход. В B, C, D у меня есть следующее в onPause. UserExiting - это флаг, который я установилиз диалогового окна «Выход».

protected void onPause()
   {
      Log.i(this.toString(), "onPause");

      // hack to try to setResult for an activity whose finishActivty was called
      if ( !this.exiting ) 
      {
         Log.i(this.toString(), "======== RESULT_OK ========"); 
         Intent returnIntent = new Intent();
         setResult(RESULT_OK, returnIntent);
         finish();
      }

      displayed = false;

      super.onPause();
   }

Есть идеи?

Правка - чтобы прояснить ситуацию, проблема заключается в том, что после вызова finishActivty в старом Activity, поскольку результат никогда не был установлен, Activity A всегдадумает, что должно выйти. Одна странная сторона. Это не происходит, пока пользователь не переместится два раза. Другими словами, отображается B, и они выбирают перейти к C. Работает, но я вижу в журнале, что onActivityResult не имеетПользователь выбирает переход от C к D, бум, я вижу два вызова onActivtyResult: «A; выходы и D остаются, и пользователь не может уйти.

Обновление: так как это имеетбПолучив много просмотров, я решил опубликовать это обновление.Проект развивался таким образом, что иногда отображается одно действие, а иногда группа отображается в виде вкладок.Когда пользователь выходит из вкладки, в некоторых случаях необходимо было возвращать данные в действие, которое открывалось на вкладках.Прежде чем я добавлю код ниже, RESULT_CANCELED всегда будет возвращаться.Также убедитесь, что setResult вызывается перед финишем.

 if (getParent() == null)
 {
    setResult(Activity.RESULT_OK, intent);
 }
 else
 {
    getParent().setResult(Activity.RESULT_OK, intent);
 }

1 Ответ

2 голосов
/ 11 ноября 2010

Я не совсем слежу за всем, что вы здесь делаете, но не похоже, что вы правильно перемещаетесь между действиями. Я настоятельно рекомендую внимательно прочитать пример в блокноте *1001*, чтобы вы понимали способ перехода между операциями для Android.

Вот что я понимаю относительно того, что вы пытаетесь выполнить: Задание A может перейти к B, C или D. Из B, C или D вы можете перейти к любому другому.

Вы пытаетесь каким-то образом использовать действие A в качестве контроллера, чтобы оно завершало другие действия. Не делай этого. Каждое занятие должно отвечать за то, чтобы завершить себя в нужной точке.

Если вы хотите перейти от A -> B в стеке к A -> C, то я бы сделал это:

A запускает B для результата. Когда пользователь выбирает что-то в B с просьбой перейти к C, у вас есть несколько вариантов. Вы можете иметь B начать C не для результата, а затем закончить. Это будет иметь эффект удаления B из стека при выходе из C. Или, вы могли бы закончить сам B, передав обратно примечание, что C должен быть загружен в намерении результатов. A мог бы затем загрузить C для результата.

Я действительно не уверен, почему вы хотите такого поведения, хотя. Как пользователь Android, если я перейду с A -> B -> C, я ожидаю, что ответный удар вернет меня к B.

Кроме того, ваш "хакерский выход" не имеет никакого смысла. К тому времени, когда вы добираетесь до onPause, результат уже установлен. Вы не можете изменить это здесь. Вам нужно правильно установить результат, когда вы заканчиваете, перед onPause.

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