Существует гораздо более простой способ получить результат от DialogFragment.
Во-первых, в вашу активность, фрагмент или действие фрагмента необходимо добавить следующую информацию:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// Stuff to do, dependent on requestCode and resultCode
if(requestCode == 1) { // 1 is an arbitrary number, can be any int
// This is the return result of your DialogFragment
if(resultCode == 1) { // 1 is an arbitrary number, can be any int
// Now do what you need to do after the dialog dismisses.
}
}
}
requestCode
в основном ваша int-метка для DialogFragment, который вы назвали, я покажу, как это работает через секунду. ResultCode - это код, который вы отправляете обратно из DialogFragment, сообщая вашей текущей ожидающей активности, фрагменту или фрагменту активности, что произошло.
Следующий фрагмент кода - это вызов DialogFragment. Пример здесь:
DialogFragment dialogFrag = new MyDialogFragment();
// This is the requestCode that you are sending.
dialogFrag.setTargetFragment(this, 1);
// This is the tag, "dialog" being sent.
dialogFrag.show(getFragmentManager(), "dialog");
С помощью этих трех строк вы объявляете свой DialogFragment, устанавливая requestCode (который будет вызывать onActivityResult (...) после закрытия Dialog, и затем вы показываете диалоговое окно. Это так просто.
Теперь в вашем DialogFragment вам нужно просто добавить одну строку непосредственно перед dismiss()
тем, чтобы вы отправили resultCode обратно в onActivityResult ().
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, getActivity().getIntent());
dismiss();
Вот и все. Обратите внимание, resultCode определяется как то, int resultCode
что я установил resultCode = 1;
в этом случае.
Вот и все, теперь вы можете отправить результат вашего DialogFragment обратно в ваш вызывающий Activity, Fragment или FragmentActivity.
Кроме того, похоже, что эта информация была опубликована ранее, но не было приведено достаточного примера, поэтому я подумал предоставить более подробную информацию.
РЕДАКТИРОВАТЬ 06.24.2016
Я прошу прощения за вводящий в заблуждение код выше. Но вы, безусловно, не можете получить результат обратно в вид деятельности в виде строки:
dialogFrag.setTargetFragment(this, 1);
ставит цель Fragment
а не Activity
. Таким образом, чтобы сделать это, вам нужно использовать реализовать InterfaceCommunicator
.
В вашем DialogFragment
наборе глобальная переменная
public InterfaceCommunicator interfaceCommunicator;
Создайте публичную функцию для обработки
public interface InterfaceCommunicator {
void sendRequestCode(int code);
}
Затем , когда вы будете готовы отправить код обратно к Activity
когда DialogFragment
выполняются бег, просто добавьте строку перед вами dismiss();
вашим DialogFragment
:
interfaceCommunicator.sendRequestCode(1); // the parameter is any int code you choose.
Теперь в своей деятельности вы должны сделать две вещи, во-первых, удалить одну строку кода, которая больше не применима:
dialogFrag.setTargetFragment(this, 1);
Затем реализуйте интерфейс, и все готово. Вы можете сделать это, добавив следующую строку в implements
предложение в самом верху вашего класса:
public class MyClass Activity implements MyDialogFragment.InterfaceCommunicator
И тогда @Override
функция в деятельности,
@Override
public void sendRequestCode(int code) {
// your code here
}
Вы используете этот метод интерфейса так же, как и onActivityResult()
метод. За исключением того, что метод интерфейса предназначен для, DialogFragments
а другой - для Fragments
.