Я использую DialogFragments для ряда вещей: выбор элемента из списка, ввод текста.
Каков наилучший способ вернуть значение (то есть строку или элемент из списка) обратно в вызывающую деятельность / фрагмент?
В настоящее время я выполняю вызывающее действие DismissListener
и даю DialogFragment ссылку на это действие. Затем Dialog вызывает OnDimiss
метод в действии, и действие получает результат из объекта DialogFragment. Очень грязно и не работает при изменении конфигурации (изменении ориентации), так как DialogFragment теряет ссылку на действие.
Спасибо за любую помощь.
Activity
и другоеDialogFragment
. ИспользованиеActivity
переданногоonAttach(Activity activity)
является правильным и рекомендуемым способом.Ответы:
Используйте
myDialogFragment.setTargetFragment(this, MY_REQUEST_CODE)
из того места, где вы показываете диалог, а затем, когда ваш диалог закончен, из него вы можете позвонитьgetTargetFragment().onActivityResult(getTargetRequestCode(), ...)
и внедритьonActivityResult()
в содержащий фрагмент.Это похоже на злоупотребление
onActivityResult()
, тем более что оно вообще не связано с деятельностью. Но я видел это рекомендованным официальными людьми Google, и, возможно, даже в демоверсиях API. Я думаю, что это то, чтоg/setTargetFragment()
было добавлено.источник
Как вы можете видеть здесь, есть очень простой способ сделать это.
В ваш
DialogFragment
добавить интерфейс слушателя, как:Затем добавьте ссылку на этого слушателя:
Это будет использоваться для «активации» метода (ов) слушателя, а также для проверки того, реализует ли родительский Activity / Fragment этот интерфейс (см. Ниже).
В
Activity
/FragmentActivity
/Fragment
который "вызывается"DialogFragment
просто реализуй этот интерфейс.В вашем
DialogFragment
все , что нужно добавить в точке , где вы хотели бы уволитьDialogFragment
и вернуть результат заключается в следующем:Где
mEditText.getText().toString()
то, что будет передано обратно в призваниеActivity
.Обратите внимание, что если вы хотите вернуть что-то еще, просто измените аргументы, которые принимает слушатель.
Наконец, вы должны проверить, был ли интерфейс фактически реализован родительским действием / фрагментом:
Этот метод очень гибкий и позволяет перезвонить с результатом, даже если вы еще не хотите закрывать диалог.
источник
Activity
's' иFragmentActivity
's', но если вызывающий абонентFragment
?Fragment
.Fragment
тогда, вы можете сделать несколько вещей: 1. Передать фрагмент как ссылку (может быть, это не очень хорошая идея, поскольку вы можете вызвать утечки памяти). 2. ИспользуйтеFragmentManager
и позвонитеfindFragmentById
илиfindFragmentByTag
он получит фрагменты, которые существуют в вашей деятельности. Надеюсь, это помогло. Хорошего дня!setTargetFragment()
иgetTargetFragment()
волшебство.Существует гораздо более простой способ получить результат от DialogFragment.
Во-первых, в вашу активность, фрагмент или действие фрагмента необходимо добавить следующую информацию:
requestCode
в основном ваша int-метка для DialogFragment, который вы назвали, я покажу, как это работает через секунду. ResultCode - это код, который вы отправляете обратно из DialogFragment, сообщая вашей текущей ожидающей активности, фрагменту или фрагменту активности, что произошло.Следующий фрагмент кода - это вызов DialogFragment. Пример здесь:
С помощью этих трех строк вы объявляете свой DialogFragment, устанавливая requestCode (который будет вызывать onActivityResult (...) после закрытия Dialog, и затем вы показываете диалоговое окно. Это так просто.
Теперь в вашем DialogFragment вам нужно просто добавить одну строку непосредственно перед
dismiss()
тем, чтобы вы отправили resultCode обратно в onActivityResult ().Вот и все. Обратите внимание, resultCode определяется как то,
int resultCode
что я установилresultCode = 1;
в этом случае.Вот и все, теперь вы можете отправить результат вашего DialogFragment обратно в ваш вызывающий Activity, Fragment или FragmentActivity.
Кроме того, похоже, что эта информация была опубликована ранее, но не было приведено достаточного примера, поэтому я подумал предоставить более подробную информацию.
РЕДАКТИРОВАТЬ 06.24.2016 Я прошу прощения за вводящий в заблуждение код выше. Но вы, безусловно, не можете получить результат обратно в вид деятельности в виде строки:
ставит цель
Fragment
а неActivity
. Таким образом, чтобы сделать это, вам нужно использовать реализоватьInterfaceCommunicator
.В вашем
DialogFragment
наборе глобальная переменнаяСоздайте публичную функцию для обработки
Затем , когда вы будете готовы отправить код обратно к
Activity
когдаDialogFragment
выполняются бег, просто добавьте строку перед вамиdismiss();
вашимDialogFragment
:Теперь в своей деятельности вы должны сделать две вещи, во-первых, удалить одну строку кода, которая больше не применима:
Затем реализуйте интерфейс, и все готово. Вы можете сделать это, добавив следующую строку в
implements
предложение в самом верху вашего класса:И тогда
@Override
функция в деятельности,Вы используете этот метод интерфейса так же, как и
onActivityResult()
метод. За исключением того, что метод интерфейса предназначен для,DialogFragments
а другой - дляFragments
.источник
dialogFrag.setTargetFragment(this, 1)
из Activity, но этот метод получает Fragment в качестве первого аргумента, так что это не может быть приведено. Я прав ?@Override public void onAttach(Context context) { super.onAttach(context); yourInterface = (YourInterface) context; }
Ну, может быть слишком поздно, чтобы ответить, но вот что я сделал, чтобы получить результаты от
DialogFragment
. очень похоже на ответ @ brandon. Здесь я звонюDialogFragment
из фрагмента, просто поместите этот код туда, где вы вызываете свой диалог.где
categoryDialog
мой,DialogFragment
который я хочу позвонить, и после этого в вашей реализацииdialogfragment
поместите этот код, где вы устанавливаете свои данные в намерении. ЗначениеresultCode
равно 1, вы можете установить его или использовать систему, определенную.Теперь пришло время вернуться к вызывающему фрагменту и реализовать этот метод. проверьте правильность данных или успешность результата, если хотите,
resultCode
иrequestCode
в условии if.источник
Другой подход, позволяющий Фрагменту общаться до его Активности :
1) Определите публичный интерфейс во фрагменте и создайте для него переменную
2) Приведите активность к переменной mCallback во фрагменте.
3) Реализуйте слушателя в своей деятельности
4) Переопределить OnFragmentInteraction в действии
Больше информации об этом: https://developer.android.com/training/basics/fragments/communicating.html
источник
public void onAttach
фрагмент и выполнить приведение к нему активностиОдин простой способ, который я нашел, заключался в следующем: реализовать это ваш dialogFragment,
А затем в действии, которое вызвало фрагмент диалога, создайте соответствующую функцию как таковую:
Тост должен показать, что он работает. Работал на меня.
источник
Interface
, чем жестко связывать с конкретными классами.Я очень удивлен видеть , что никто не предложил использовать местное вещание для
DialogFragment
дляActivity
общения! Я считаю, что это намного проще и чище, чем другие предложения. По сути, вы регистрируетесь дляActivity
прослушивания трансляций и отправляете локальные трансляции из своихDialogFragment
экземпляров. Просто. Пошаговое руководство по настройке всего этого см. Здесь .источник
Или поделитесь ViewModel, как показано здесь:
https://developer.android.com/topic/libraries/architecture/viewmodel#sharing_data_between_fragments
источник
В моем случае мне нужно было передать аргументы в targetFragment. Но я получил исключение «Фрагмент уже активен». Поэтому я объявил интерфейс в моем DialogFragment, который реализовал parentFragment. Когда parentFragment запускает DialogFragment, он устанавливает себя как TargetFragment. Затем в DialogFragment я позвонил
источник
В котлине
// Моя активность
Я надеюсь, что это работает, если вы можете улучшить, пожалуйста, измените его Мой английский не очень хорош
источник
если вы хотите отправить аргументы и получить результат из второго фрагмента, вы можете использовать Fragment.setArguments для выполнения этой задачи
источник
Просто чтобы он был одним из вариантов (так как никто еще не упомянул об этом) - вы можете использовать шину событий, такую как Otto. Итак, в диалоге вы делаете:
И пусть ваш абонент (активность или фрагмент) подписаться на него:
источник