有什么方法可以检测到DialogFragment何时被解除,以便我可以更新其父片段?
答案 0 :(得分:32)
您可以添加侦听器并覆盖片段对话框的onDismiss:
public class DismissDialog extends DialogFragment {
private DialogInterface.OnDismissListener onDismissListener;
public void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {
this.onDismissListener = onDismissListener;
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if (onDismissListener != null) {
onDismissListener.onDismiss(dialog);
}
}
}
然后,在父级上,设置一个监听器:
DismissDialog d = new DismissDialog();
d.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
}
});
d.show(getSupportFragmentManager(), "sometag");
答案 1 :(得分:4)
覆盖DialogFragment的onDismiss(),或在构建基础对话框时,使用setOnDimissListener()设置一个监听器。
答案 2 :(得分:1)
解决此问题的一种方法是将DialogFragment嵌入到Activity中并将活动显示为Dialog,以下链接中有一个提示,说明如何:
http://developer.android.com/guide/topics/ui/dialogs.html
您可以使用它来更新底层Fragment,因为当Dialog(它是一个Activity)完成后,将在底层片段上调用onResume()。添加代码来更新onResume()方法中片段的状态,这就是它的全部内容。
答案 3 :(得分:0)
我刚刚在我的项目中解决了这个问题。我所拥有的是具有ListFragment的活动。在该列表片段中,当单击特定项时,我显示DatePickerFragment(显示DatePickerDialog的自定义DialogFragment)。选择日期后,我希望刷新ListFragment。
为了实现这一点,在托管ListFragment的活动中(事实上它还托管了DatePickerFragment)我实现了一个简单地用新实例替换ListFragment的方法,如下所示:
public void criteriaChanged()
{
getFragmentManager().beginTransaction()
.replace(R.id.container, new FilterFragment())
.commit();
}
我从DatePickerFragment中调用此方法,来自onDateSet():
FilterActivity fa = (FilterActivity) getActivity();
fa.criteriaChanged();
这对我有用。
答案 4 :(得分:0)
我试过@Gazer回答,它对我不起作用,我正在使用不同的片段类
import android.app.Fragment;
但我得到了这个工作
创建接口类
public interface MyDialogListener {
void OnCloseDialog(Object obj); //you can put any object here
}
在Parent Fragment
中实现接口类public class ActionBarFragment extends Fragment implements MyDialogListener{
@Override
public void OnCloseDialog(Object obj) {
//Do you refresh
}
然后我在DialogFragment
中添加了监听器public class SpecialDialogFragment extends DialogFragment {
MyDialogListener mListener;
public SpecialDialogFragment(MyDialogListener listener) {
this.mListener = listener;
}
@Override
public void onStop() {
super.onStop();
if(mListener!=null)
mListener.OnCloseDialog(null);
}
答案 5 :(得分:0)
这里评分最高的答案有问题。
您不能将监听器作为实例变量保存在DialogFragment
中,因为它们将无法生存下来,并且您会想知道为什么您的回调“神奇地”停止工作。
您可以在此处了解更多信息:
https://medium.com/@lukeneedham/listeners-in-dialogfragments-be636bd7f480
本文提供了一些实际的解决方案,其中我最喜欢的是将targetFragment
与自定义界面一起使用。对于拦截撤消,看起来像:
class MainFragment : Fragment(R.layout.fragment_main), DummyDialogCallback {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
openDialogButton.setOnClickListener {
val dialog = DummyDialog()
dialog.setTargetFragment(this, DIALOG_DUMMY)
dialog.show(requireFragmentManager(), "DummyDialog")
}
}
override fun onDummyDialogClick() {
Toast.makeText(requireContext(), "Dummy click", Toast.LENGTH_SHORT).show()
}
companion object {
const val DIALOG_DUMMY = 1
}
}
class DummyDialog : DialogFragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
) = inflater.inflate(R.layout.dialog_dummy, container, false)
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
val callback = targetFragment as? DummyDialogCallback
callback?.onDummyDialogClick()
}
}
interface DummyDialogCallback {
fun onDummyDialogClick()
}