Активность, в которой размещается этот фрагмент, вызывается, onActivityResult
когда возвращается активность камеры.
Мой фрагмент запускает действие для результата с намерением, посланным камерой, чтобы сделать снимок. Приложение с изображениями загружается нормально, делает снимок и возвращается. onActivityResult
, Однако , никогда не бил. Я установил точки останова, но ничего не сработало. Может ли фрагмент иметь onActivityResult
? Я бы так подумал, поскольку это предоставленная функция. Почему это не срабатывает?
ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1888);
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if( requestCode == 1888 ) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
}
}
requestCode >= 0
!Ответы:
Хостинговая активность переопределяет
onActivityResult()
, но он не вызвалsuper.onActivityResult()
необработанные коды результатов. По-видимому, даже если фрагмент является тем, который выполняетstartActivityForResult()
вызов, действие получает первый шанс при обработке результата. Это имеет смысл, если учесть модульность фрагментов. Как только я реализовалsuper.onActivityResult()
все необработанные результаты, фрагмент получил возможность обработать результат.А также из @siqing ответа:
Чтобы получить результат в вашем фрагменте, убедитесь, что вы звоните,
startActivityForResult(intent,111);
а неgetActivity().startActivityForResult(intent,111);
внутри вашего фрагмента.источник
getParentFragment().startActivityForResult
так, чтобы у родительского фрагмента был вызван метод onActivityResult.Я думаю, что ты звонил
getActivity().startActivityForResult(intent,111);
. Вам следует позвонитьstartActivityForResult(intent,111);
.источник
RingtonePreference
локацией вPreferenceFragment
. К несчастью,RingtonePreference
звонкиgetActivity().startActivityForResult()
, и я не получил результаты, хотя я звонюsuper.onActivityResult
в деятельностиonActivityResult
. Я был вынужден создать производный отRingtonePreference
класса, который связывает себя сPreferenceFragment
вызовами иfragment.startActivityForResult()
.Опция 1:
Если вы вызываете
startActivityForResult()
из фрагмента, вам следует вызыватьstartActivityForResult()
, а не такgetActivity().startActivityForResult()
, поскольку это приведет к фрагменту onActivityResult ().Если вы не уверены, куда вы звоните
startActivityForResult()
и как будете вызывать методы.Вариант 2:
Поскольку Activity получает результат
onActivityResult()
, вам нужно будет переопределить действиеonActivityResult()
и вызватьsuper.onActivityResult()
для распространения на соответствующий фрагмент для необработанных кодов результатов или для всех.Если вышеупомянутые два варианта не работают, обратитесь к варианту 3, поскольку он определенно будет работать.
Вариант 3:
Явный вызов фрагмента функции onActivityResult выглядит следующим образом.
В родительском классе Activity переопределите метод onActivityResult () и даже переопределите его в классе Fragment и вызовите, как показано в следующем коде.
В родительском классе:
В детском классе:
источник
setResult(); finish();
отодвинуться от второго действия, тогда такжеonActivityResult
вызывается с предоставленнымRESULT_CODE
.onActivityResult()
операция возвращает странный результат,requestCode
который передается моему фрагменту и затем игнорируется = /Если вы не знаете фрагменты своей деятельности, просто перечислите их все и отправьте аргументы результата действия:
источник
У меня такая же проблема с
ChildFragmentManager
. Менеджер не будет передавать результат во вложенный фрагмент, вы должны сделать это вручную в базовом фрагменте.источник
Fragment fragment = myChildFragment;
для замены приведенной вышеfindFragmentByTag
строки кода. Остальное можно оставить без изменений.Оригинальный пост.
FragmentActivity
заменяетrequestCode
на измененный. После этого, когдаonActivityResult()
будет вызвано,FragmentActivity
анализирует старшие 16 битов и восстанавливает индекс исходного фрагмента. Посмотрите на эту схему:Если у вас есть несколько фрагментов на корневом уровне, проблем нет. Но если у вас есть вложенные фрагменты , например,
Fragment
с несколькими вкладками внутриViewPager
, вы гарантированно столкнетесь с проблемой (или уже столкнулись с ней).Потому что внутри хранится только один индекс
requestCode
. Это индексFragment
внутри егоFragmentManager
. Когда мы используем вложенные фрагменты, есть дочерние элементыFragmentManager
, у которых есть свой список фрагментов. Итак, необходимо сохранить всю цепочку индексов, начиная с rootFragmentManager
.Как мы решаем эту проблему? В этом посте есть общее решение .
GitHub: https://github.com/shamanland/nested-fragment-issue
источник
Это один из самых популярных номеров. Мы можем найти много веток по этой проблеме. Но ни один из них не полезен для меня.
Таким образом, я решил эту проблему, используя это решение.
Давайте сначала поймем, почему это происходит.
Мы можем звонить
startActivityForResult
напрямую из Fragment, но на самом деле механика позади все обрабатывается Activity.После того, как вы позвоните
startActivityForResult
из фрагмента, requestCode будет изменен, чтобы прикрепить идентификатор фрагмента к коду. Это позволит Activity быть в состоянии отследить того, кто отправил этот запрос после получения результата.После того, как Activity вернется назад, результат будет отправлен в onActivityResult Activity с измененным requestCode, который будет декодирован в исходный идентификатор requestCode + Fragment. После этого Activity отправит результат Activity этому фрагменту через onActivityResult. И все это сделано.
Проблема в:
Activity может отправить результат только фрагменту, который был прикреплен непосредственно к Activity, но не вложенному. Вот почему onActivityResult вложенного фрагмента никогда не будет вызываться, несмотря ни на что.
Решение:
1) Начните Намерение в своем Фрагменте с помощью кода ниже:
2) Теперь в вашей родительской активности переопределить **
onActivityResult()
: **Вы должны вызвать это в родительском действии, чтобы заставить это работать.
3) В вашем фрагменте позвоните:
Вот и все. С помощью этого решения его можно применять для любого отдельного фрагмента, независимо от того, является он вложенным или нет. И да, это также охватывает все дела! Кроме того, коды также хороши и чисты.
источник
ДЛЯ МНОГИХ ВСТРОЕННЫХ ФРАГМЕНТОВ (например, при использовании ViewPager во фрагменте)
В вашей основной деятельности :
В вашем фрагменте:
В вашем вложенном фрагменте
Активность звонка
uniqueInstanceInt - замените его на int, уникальное среди вложенных фрагментов, чтобы другой фрагмент не обработал ответ.
Получить ответ
Внимание
Число от 0 до 65536 необходимо использовать в uniqueInstanceInt во избежание ошибок: «Можно использовать только младшие 16 битов для requestCode».
источник
Я могу добавить два совета, если кто-то все еще не может сделать это. В файле Manifest.xml убедитесь, что хостинг-операция не завершилась при обратном вызове, и для запускаемой активности стандартным является режим запуска. Подробности см. Ниже:
Для активности хостинга установите для свойства no history значение false, если
Для запуска действия установите стандартный режим запуска, если
источник
Я также столкнулся с той же проблемой, как только переместил этот блок кода за пределы фрагмента в служебный класс ,
parentActivity
передав его в качестве аргумента :Тогда я не получал никакого значения в
onActivityResult
методе этого фрагмента. После этого я изменил аргумент на фрагмент , поэтому пересмотренное определение метода выглядело так:После этого я смог получить значение
onActivityResult
на фрагментисточник
Я также встретил эту проблему во фрагменте. И я позвонил
startActivityForResult
вDialogFragment
.Но теперь эта проблема была решена
FragmentClassname.this.startActivityForResult
.источник
startActivityForResult(...)
из абстрактного класса внутри кода фрагмента.ДЛЯ ВСТРОЕННЫХ ФРАГМЕНТОВ (например, при использовании ViewPager)
В вашей основной деятельности:
В вашем основном фрагменте верхнего уровня (фрагмент ViewPager):
В YourFragment (вложенный фрагмент):
источник
В моем случае это была ошибка Android ( http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/ ), если вы используете поддерживаемый,
FragmentActivity
вы должны использоватьgetSupportFragmentManager
вместоgetChildFragmentManager
:источник
Короче говоря,
Во фрагменте объявляем
Fragment fragment = this
;после этого использования
fragment.startActivityForResult
.Результат вернется в ActivityResult.
источник
Решение 1:
Позвони
startActivityForResult(intent, REQUEST_CODE);
вместоgetActivity().startActivityForResult(intent, REQUEST_CODE);
.Решение 2:
Когда
startActivityForResult(intent, REQUEST_CODE);
вызывается действие,onActivityResult(requestCode,resultcode,intent)
вызывается, и затем вы можете позвонитьfragments onActivityResult()
отсюда, передавrequestCode, resultCode and intent
.источник
Внутри вашего фрагмента звоните
где
this
ссылается на фрагмент. В противном случае сделайте, как сказал @Clevester:Я также должен был позвонить
в родительской деятельности,
onActivityResult
чтобы заставить его работать.(Я адаптировал этот ответ из ответа @ Clevester.)
источник
Для тех , кто использует Android навигация компоненты следует использовать в данном виде деятельности , чтобы получить его фрагмент ссылки и вызов фрагмента
onActivityResult(...)
primaryNavigationFragment
fragment.onActivityResult(...)
.Вот активность
onActivityResult(...)
источник
Большинство из этих ответов постоянно говорят о том, что вы должны позвонить
super.onActivityResult(...)
своему хостуActivity
для вашегоFragment
. Но это, похоже, не работает для меня.Таким образом, в вашем хосте
Activity
вы должны позвонитьFragments
onActivityResult(...)
вместо этого. Вот пример.В какой-то момент
HostActivity
вам нужно будет назначить то,this.myFragment
чтоFragment
вы используете. Или используйте,FragmentManager
чтобы получитьFragment
вместо того, чтобы хранить ссылку на него в вашемHostActivity
. Кроме того, проверьте,null
прежде чем пытаться позвонитьthis.myFragment.onActivityResult(...);
.источник
источник
Вы можете просто переопределить BaseActivity
onActivityResult
для фрагментаbaseActivity.startActivityForResult
.На BaseActivity добавьте интерфейс и переопределите onActivityResult.
На Фрагменте реализует
OnBaseActivityResult
Этот обходной путь сделает свое дело.
источник
Если вышеупомянутая проблема встречается при входе в Facebook, то вы можете использовать приведенный ниже код в родительской активности вашего фрагмента, например:
Или:
И добавьте приведенный ниже вызов в свой фрагмент ...
источник
Другой вариант использования, который еще не описан в других ответах:
onActivityResult()
объявленный во фрагменте не вызывается при использованииexception.startResolutionForResult()
:В этом случае замените
exception.startResolutionForResult()
фрагментомstartIntentSenderForResult()
:источник
Версия Kotlin (в вашей активности onActivityResult ())
источник
Как упоминал Олли С, существует активная ошибка для библиотеки поддержки, использующей возвращаемые значения для onActivityResult, когда вы используете вложенные фрагменты. Я просто ударил :-(.
См. Fragment.onActivityResult не вызывается, когда requestCode! = 0 .
источник
У меня есть сильное подозрение, что все ответы здесь - не более чем взломы. Я перепробовал их всех и многих других, но без какого-либо достоверного заключения, поскольку всегда есть какая-то глупая проблема. Я, например, не могу полагаться на противоречивые результаты. Если вы посмотрите официальную документацию по Android API для фрагментов, вы увидите, что Google четко заявляет следующее:
Смотрите: Android Fragment API
Таким образом, может показаться, что наиболее правильным и надежным подходом было бы на самом деле вызвать startActivityForResult () из действия хостинга, а также обработать итоговый onActivityResult () оттуда.
источник
mActivity.startActivityFromFragment(this, intent, requestCode)
- это не что иное, какВаш код имеет вложенный фрагмент. Вызов super.onActivityForResult не работает
Вы не хотите изменять каждое действие, из которого может быть вызван ваш фрагмент, или выполнять обход всех фрагментов в цепочке фрагментов.
Вот одно из многих работающих решений. создайте фрагмент на лету и подключите его непосредственно к операции с помощью менеджера фрагментов поддержки. Затем вызовите startActivityForResult из вновь созданного фрагмента.
источник
Моя проблема была с хост-активностью. Я нашел ее с помощью набора,
android:launchMode="standard"
я удалил его временно, и он работает!источник
onActivityResult не будет работать, если ваш режим запуска установлен в SingleInstance или SingleTask. или вы называете свою деятельность с помощью этих IntentFilters
standard
илиsingleTop
режим запуска будет работать нормально.источник
Если вы используете вложенные фрагменты, это также работает:
В дополнение к этому, вы должны позвонить
super.onActivityResult
из родительской деятельности и заполнитьonActivityResult
метод фрагмента.источник
Я решил эту проблему, написав базовый класс, который расширяется
Fragment
, и вonactivityresult
рамках действия я определил текущий запущенный фрагмент, используяfragmenttag
. Затем я вызываю пользовательский метод в классе фрагмента. Это вызовет событие в текущем фрагменте.источник