解除dialogfragment时刷新片段

时间:2012-03-24 16:38:49

标签: android android-fragments

有什么方法可以检测到DialogFragment何时被解除,以便我可以更新其父片段?

6 个答案:

答案 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; 

但我得到了这个工作

  1. 创建接口类

    public interface MyDialogListener {
        void OnCloseDialog(Object obj); //you can put any object here
    }
    
  2. 在Parent Fragment

    中实现接口类
    public class ActionBarFragment extends Fragment implements MyDialogListener{
    
        @Override
        public void OnCloseDialog(Object obj) {
            //Do you refresh
        }
    
  3. 然后我在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()
}