Android 对话片段中的OnDismissListener

Android 对话片段中的OnDismissListener,android,fragment,listener,dismiss,Android,Fragment,Listener,Dismiss,在我的应用程序中,我有一个打开对话框片段的片段。在我的对话框片段中,我从用户那里获取一些保存在静态类中的设置,但我需要一个侦听器来通知我的片段对话框已关闭 我使用这个链接的第一个答案中的代码,但这部分代码不起作用,因为我有一个片段,而不是一个活动。onDismiss方法在dialogfragment中被调用,但if语句失败,因此不调用片段。我试图用getFragmentManager、getParentFragment和get/setTargetFragment替换该部分,但不起作用 有人能帮我

在我的应用程序中,我有一个打开对话框片段的片段。在我的对话框片段中,我从用户那里获取一些保存在静态类中的设置,但我需要一个侦听器来通知我的片段对话框已关闭

我使用这个链接的第一个答案中的代码,但这部分代码不起作用,因为我有一个片段,而不是一个活动。onDismiss方法在dialogfragment中被调用,但if语句失败,因此不调用片段。我试图用getFragmentManager、getParentFragment和get/setTargetFragment替换该部分,但不起作用

有人能帮我吗

public void onDismiss(final DialogInterface dialog) {
    super.onDismiss(dialog);

    // code I've tried
    final FragmentManager fragment = getFragmentManager();
    if (fragment instanceof DialogInterface.OnDismissListener) {
        ((DialogInterface.OnDismissListener) fragment).onDismiss(dialog);
    }

    // original answer code  
    /*final Activity activity = getActivity();
    if (activity instanceof DialogInterface.OnDismissListener) {
        ((DialogInterface.OnDismissListener) activity).onDismiss(dialog);
    }*/

}

我认为你可以通过另一种方式来实现:

// create a function in YourFragment
public void myDissmiss();
// change your newInstance(bitmap) of your dialog fragment
public static DialogFragmentImage newInstance(Bitmap b,YourFragment f);

然后,您可以在
对话框FragmentImage
public void onDismiss(最终对话框界面对话框)
中调用
yourfragment.myDissmiss()
,我想您可以用另一种方法来实现它:

// create a function in YourFragment
public void myDissmiss();
// change your newInstance(bitmap) of your dialog fragment
public static DialogFragmentImage newInstance(Bitmap b,YourFragment f);

然后,您可以在
对话框FragmentImage
公共void onDismiss(最终对话框界面对话框)
中调用
yourfragment.myDissmiss()
,您可以尝试界面回调

在对话框片段中创建一个接口

    public interface Listener{
     void onDismiss();
    }
在你的片段中实现这一点

public class MyFragment extends Fragment implements MyDialogFragment.Listener{

  @Override
public void onDismiss(){
  //write the operations here   
 }
}
现在在对话框片段中接收父片段的对象, 例:

您必须从片段中调用此方法,以设置侦听器

现在,在对话框片段的onDismiss()方法中,使用此引用调用onDismiss

进行必要的空检查

也请检查下面的链接


您可以尝试接口回调

在对话框片段中创建一个接口

    public interface Listener{
     void onDismiss();
    }
在你的片段中实现这一点

public class MyFragment extends Fragment implements MyDialogFragment.Listener{

  @Override
public void onDismiss(){
  //write the operations here   
 }
}
现在在对话框片段中接收父片段的对象, 例:

您必须从片段中调用此方法,以设置侦听器

现在,在对话框片段的onDismiss()方法中,使用此引用调用onDismiss

进行必要的空检查

也请检查下面的链接


这是一个老问题,但我没有找到满意的解决方案。我不喜欢将任何侦听器传递给DialogFragment或设置TargetFragment,因为这可能会在方向更改时中断。你觉得这个怎么样

    MyDialog d = new MyDialog();
        d.show(fragmentManager, "tag");
        fragmentManager.registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() {
                @Override
            public void onFragmentViewDestroyed(FragmentManager fm, Fragment f) {
                super.onFragmentViewDestroyed(fm, f);
                //do sth      
        fragmentManager.unregisterFragmentLifecycleCallbacks(this);
                }
            }, false);

这是一个老问题,但我没有找到我满意的解决方案。我不喜欢将任何侦听器传递给DialogFragment或设置TargetFragment,因为这可能会在方向更改时中断。你觉得这个怎么样

    MyDialog d = new MyDialog();
        d.show(fragmentManager, "tag");
        fragmentManager.registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() {
                @Override
            public void onFragmentViewDestroyed(FragmentManager fm, Fragment f) {
                super.onFragmentViewDestroyed(fm, f);
                //do sth      
        fragmentManager.unregisterFragmentLifecycleCallbacks(this);
                }
            }, false);

你试过接口回调吗?我是Android新手,你能给我解释一下吗?使用
final Fragment=getParentFragment()
。并检查父片段是否是实现onDismissListener的片段。如果没有,请检查您的片段树。您尝试过接口回调吗?我是Android新手,您能给我解释一下吗?使用
final fragment fragment=getParentFragment()
。并检查父片段是否是实现onDismissListener的片段。如果没有,请检查您的片段树。当我使用setListener时(此)不起作用,因为我在视图中。OnClickListener所以不接受“this”。有什么建议吗?我解决了,我用了完全不同的方法。感谢您的时间。当我使用setListener时(此)不起作用,因为我在视图中。OnClickListener所以不接受“此”。有什么建议吗?我解决了,我用了完全不同的方法。感谢您的时间。很抱歉我不理解您的答案。很抱歉我不理解您的答案。我完全更改了代码以找到解决方案,这是一个1年前完成的旧项目,因此我无法尝试使用此新代码来解决旧问题。顺便说一句,你发布的代码应该有用,我也喜欢你回答一个老问题的方式。老实说,我甚至找到了更好的解决方案。无法在DialogFragment上使用getDialog,然后设置Dislose侦听器的原因是FragmentTransaction尚未执行。因此,当您在FragmentManager getDialog上执行PendingTransactions时,将不会返回null。如果没有appcompat registerFragmentLifecycleCallbacks
调用需要API级别26
我完全更改代码以找到解决方案,这是一个1年前完成的旧项目,因此我无法尝试使用此新代码来解决旧问题。顺便说一句,你发布的代码应该有用,我也喜欢你回答一个老问题的方式。老实说,我甚至找到了更好的解决方案。无法在DialogFragment上使用getDialog,然后设置Dislose侦听器的原因是FragmentTransaction尚未执行。因此,当您在FragmentManager上执行PendingTransactions时,getDialog将不会返回null。如果没有appcompat注册表,FragmentLifecycleCallbacks
调用需要API级别26