有没有办法检测当DialogFragment被关闭时,我可以更新它的父Fragment?
您可以添加一个监听器并覆盖您的片段对话框的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");
如果需要覆盖DialogFragment的onDismiss()方法,或者需要在构建基础对话框时设置侦听器,请使用setOnDimissListener()方法。
import android.app.Fragment;
Create an interface class
public interface MyDialogListener {
void OnCloseDialog(Object obj); //you can put any object here
}
Implement the interface class in the Parent Fragment
public class ActionBarFragment extends Fragment implements MyDialogListener{
@Override
public void OnCloseDialog(Object obj) {
//Do you refresh
}
and then I add the listener inside the 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);
}
解决这个问题的一种方法是将您的DialogFragment嵌入到一个Activity中,并将该Activity显示为对话框,以下链接中有一个提示来解释如何实现:
你可以使用这个方法来更新底层的Fragment,因为当Dialog(它是一个Activity)完成时,底层的fragment将会调用onResume()。在onResume()方法中添加代码来更新fragment的状态就可以了。保留HTML标签。public void criteriaChanged()
{
getFragmentManager().beginTransaction()
.replace(R.id.container, new FilterFragment())
.commit();
}
我从DatePickerFragment的onDateSet()方法调用此方法:
FilterActivity fa = (FilterActivity) getActivity();
fa.criteriaChanged();
这对我来说很管用。
这里的最佳答案存在问题。
在DialogFragment
中,你不能将监听器保存为实例变量,因为它们不会幸存于重建过程中,你会惊奇地发现你的回调 '神奇地' 停止工作。
你可以在这里阅读更多相关信息:
https://medium.com/@lukeneedham/listeners-in-dialogfragments-be636bd7f480
本文提供了几个实际的解决方案,其中我最喜欢的是使用带有自定义接口的targetFragment
。要拦截dismiss,可以这样做: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()
}
// Create a FragmentLifecycleCallbacks (inner) class:
inner class ChildFragmentCallbacks : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentPaused(fm: FragmentManager, f: Fragment) {
super.onFragmentPaused(fm, f)
if(f is YourDialogFragment){
// YourDialogFragment is closed, you can update parent fragment here
updateParentFragment()
}
}
}
childFragmentManager.registerFragmentLifecycleCallbacks(ChildFragmentCallbacks(), false)
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
class YourParentFragment : Fragment() {
// ...
// Create a FragmentLifecycleCallbacks (inner) class:
inner class ChildFragmentCallbacks : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentPaused(fm: FragmentManager, f: Fragment) {
super.onFragmentPaused(fm, f)
if(f is YourDialogFragment){
// YourDialogFragment is closed, you can update parent fragment here
updateParentFragment()
}
}
}
private fun updateParentFragment(){
// Do it
}
// Register it on onCreate():
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
childFragmentManager.registerFragmentLifecycleCallbacks(ChildFragmentCallbacks(), false)
}
// ...
}