【问题标题】:OnDismissListener in a DialogFragmentDialogFragment 中的 OnDismissListener
【发布时间】:2020-02-16 02:09:57
【问题描述】:

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

我使用此链接stackoverflow question 的第一个答案中的代码,但这部分代码不起作用,因为我有一个片段而不是一个活动。 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);
    }*/

}

【问题讨论】:

  • 你试过接口回调了吗?
  • 我是 Android 新手,你能解释一下吗?
  • 使用final Fragment fragment = getParentFragment()。并检查父片段是否是实现 onDismissListener 的片段。如果没有,请检查您的片段树。

标签: android fragment listener dismiss


【解决方案1】:

这是一个老问题,但我没有找到满意的解决方案。我不喜欢将任何侦听器传递给我的 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 上使用 getDialog 然后设置关闭侦听器的原因是 FragmentTransaction 尚未执行。所以当你在 FragmentManager 上执行 PendingTransactions 时,getDialog 不会返回 null。
  • 不带appcompat registerFragmentLifecycleCallbacks Call requires API level 26
【解决方案2】:

你可以试试接口回调,

在你的对话框片段中创建一个界面

    public interface Listener{
     void onDismiss();
    }

在你的片段中实现它,

public class MyFragment extends Fragment implements MyDialogFragment.Listener{

  @Override
public void onDismiss(){
  //write the operations here   
 }
}

现在在你的对话片段中接收你的父片段的对象, 例如:

public void setListener(Listener listener){
 this.mListener = listener;
}

你必须从你的片段中调用这个方法来设置监听器。

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

@Override
public void onDismiss(){
  mListener.onDismiss();
}

进行必要的空值检查

也检查下面的链接

How to get button clicks in host fragment from dialog fragment

【讨论】:

  • 当我使用 setListener(this) 时不起作用,因为我在 View.OnClickListener 中所以不接受“this”。有什么建议吗?
  • 我解决了,我使用完全不同的方法。感谢您的宝贵时间。
【解决方案3】:

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

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

那么您可以在您的public void onDismiss(final DialogInterface dialog)DialogFragmentImage 中调用yourfragment.myDissmiss()

【讨论】:

  • 对不起,我不明白你的回答。
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
相关资源
最近更新 更多