创建 DialogFragment 实例的意外行为

Unexpected behaviour creating DialogFragment instance

我有这个android.app.DialogFragment:

public class MyDialog extends DialogFragment {

   private Callback callback;

    public static MyDialog newInstance() {
      return new MyDialog();
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog dialog = new AlertDialog.Builder(getActivity())
            //set more things
            .setPositiveButton("Ok", new DialogInterface.OnClickListener(){
                callback.run(); //callback is null        
            }).create();
        return dialog;
    }

    public void setCallback(Callback callback) { this.callback = callback; }

}

来自我的 activity:

MyDialog dialog = MyDialog.newInstance();
dialog.setCallback(myCallback);
dialog.show(getFragmentManager(), "dialog");

但是当我点击 "Ok" 按钮时,它崩溃了,因为回调是 nullmyCallback 永远不会为空

我发现了一些东西。 onCreateDialog 被调用了两次,第二次 callbacknull:

  @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Log.d("test", "onCreateDialog (" + this + ") -> " + callback);
        //more code
    }

它打印:

onCreateDialog (MyDialog{18ea188e}) -> com.house.hehe.MyActivity@3afbe8af

onCreateDialog (MyDialog{22199eaa}) -> null

怎么可能?为什么会有两个不同的实例?为什么 onCreateDialog 被调用了两次?

我认为您应该像使用普通 Fragment 一样设置回调,在 onAttach(Context context) 中设置它并在 onDetach()

中删除它

我不知道发生了什么,但我已经通过执行 callback static static:

解决了

私有静态回调回调;

public static MyDialog newInstance(Callback callback) {
    MyDialog.callback = callback;      
    return new MyDialog();
}

这是一个丑陋的解决方案...哦好吧...