Вызов startIntentSenderForResult из фрагмента (без использования существующей активности) (Android Billing v3)

По этому вопросу:

Вызов startIntentSenderForResult из фрагмента (Android Billing v3)

Вызов startIntentSenderForResult требует, чтобы вы передали Activity, реализующее onActivityResult(...). Фрагменты не могут реализовать это, поэтому, если вы хотите вызвать метод из одного, вы должны передать его через Activity, предположительно через Activity, который создал фрагмент.

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

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

Я думаю о чем-то вроде:

  • фрагмент, который выполняет вызов, создает временную активность, содержащую ссылку на фрагмент, и реализует onActivityResult, который обрабатывает обратный вызов и маршрутизирует обратно во фрагмент.

Помощь любого рода будет принята с благодарностью.


person Fullplate    schedule 17.03.2014    source источник
comment
См. этот вопрос: stackoverflow.com /questions/6147884/ Здесь есть много ответов, один из которых может оказаться правильным для вас.   -  person lenooh    schedule 05.09.2016


Ответы (1)


Поведение по умолчанию для Activity (как показано в источник FragmentActivity для onActivityResult) заключается в передаче onActivityResult всем прикрепленным фрагментам onActivityResult в дополнение к onActivityResult действия. Поэтому просто обработайте onActivityResult в своем фрагменте.

Примечание. Если ваша активность обрабатывает onActivityResult, убедитесь, что она вызывает super.onActivityResult, иначе вызов onActivityResult фрагмента не произойдет.

person ianhanniballake    schedule 17.03.2014
comment
Хм, так что я предполагаю, что это означает передачу ссылки на мою основную активность и реализацию onActivityResult через цепочку Активность -> фрагмент -> фрагмент. Я посмотрю, смогу ли я заставить это работать. - person Fullplate; 17.03.2014
comment
Просто вызовите getActivity() в своем фрагменте, и все должно работать. - person ianhanniballake; 17.03.2014
comment
О, по поводу вашего второго абзаца, я не понимаю... или произойдет вызов onActivityResult фрагмента - разве это не то, чего я пытаюсь достичь? запутался - person Fullplate; 17.03.2014
comment
О, это кажется намного проще. Спасибо! - person Fullplate; 17.03.2014
comment
Забыл "не" в последнем предложении. Отредактировано - person ianhanniballake; 17.03.2014
comment
@Fullplate: можете ли вы добавить рабочий код в вопрос? - person Trung Nguyen; 22.08.2014
comment
@Jul В итоге я покинул эту должность, прежде чем реализовать ответ. Так что нет рабочего кода. Хотя задним числом это кажется довольно простым. Вы делаете свой startIntentSenderForResult(pendingIntent.getIntentSender(), 1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0)); и передайте свою родительскую активность в качестве первого аргумента. Переопределите onActivityResult во фрагменте, и вы должны получить результат. - person Fullplate; 26.08.2014
comment
@Fullplate В настоящее время я делаю ((InAppPurchaseFragment)fragment).onActivityResult(requestCode, resultCode, data); в onActivityResult ParentActivity. Итак, мой фрагмент получил намерение. Но я не уверен, что это правильное решение - person Trung Nguyen; 26.08.2014
comment
@Fullplate: мой случай похож на ваш. У меня началась родительская активность PaymentFragment (состоит из многих способов оплаты). Этот фрагмент запускает фрагмент InAppPurchase. - person Trung Nguyen; 26.08.2014
comment
Согласно ответу, фрагмент должен вызываться onActivityResult автоматически, но если этот способ работает, то все должно быть в порядке! - person Fullplate; 26.08.2014
comment
Этот ответ неверен, согласно исходному файлу, на который он ссылается. FragmentActivity не передает onActivityResult всем прикрепленным фрагментам. Он передает его ровно одному фрагменту, используя старшие 16 бит requestCode для хранения индекса вызывающего фрагмента, но только если вы вызвали startActivityForResult() из фрагмента, а не из действия. Поскольку вопрос касается startIntentSenderForResult(), который доступен только в Activity, а производные фрагменты не могут запрашивать свой собственный индекс, нет возможности вызвать Activity.startIntentSenderForResult и получить результаты в Fragment.onActivityResult. - person foo64; 07.01.2015