在低内存被杀死后重新创建后,取消DialogFragment

时间:2017-06-16 07:34:51

标签: android android-dialogfragment

我的DialogFragment有一个听众,我从某些ActivityFragment传来。 因此,使用下面的当前代码,如果我打开此对话框然后转到后台并将其放置很长时间或设备处于低内存,则对话框将清除。
然后,当我再次打开应用并按btnOK时,我会得到NullPointerException,因为listener = null

public class Dialog extends DialogFragment {
    DialogListener listener;

    public static Dialog newInstance(String title, DialogListener listener) {
        Bundle args = new Bundle();
        Dialog fragment = new Dialog();
        fragment.setArguments(args);
        fragment.setListener(listener);
        return fragment;
    }

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

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState != null){
            dismiss();
        }
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.dialog_view, container);
        Button btnOK = (Button) rootView.findViewById(R.id.btnOK);

        btnOK.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onClick();
                dismiss();
            }
        });
        return rootView;
    }

    interface DialogListener {
        void onClick();
    }
}

为了防止它,我将在重新创建时忽略DialogFragment。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(savedInstanceState != null){
        dismiss();
    }
}

在片段破坏和重新创建时效果很好,但我不知道这个解决方案是否适用于所有情况?我忽略了onCreate()内的对话框,所以我担心如果在某些情况下我不能处理用户永远不能打开对话框。
任何帮助或建议都将非常感激。

2 个答案:

答案 0 :(得分:0)

如果活动被破坏,您可以关闭对话框。

只需在对话框片段中添加。

@Override
public void onSaveInstanceState(Bundle outState) {
    dismissAllowingStateLoss();
    super.onSaveInstanceState(outState);
}

答案 1 :(得分:0)

listener为空的原因是您使用setListener自行设置。您可以通过在onAttach方法中设置侦听器来将此责任放在Android上。

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (!(context instanceof YourDialogListener)) {
        throw new RuntimeException(context.getClass() + " must implement "
                + YourDialogListener.class);
    }
    listener = (YourDialogListener) context;
}

然后在您的活动中

public class YourActivity extends AppCompatActivity implements YourDialogListener {
    private void someMethodHandlingButtonOrMenuClick() {
        DialogFragment dialogFragment = new YourDialogFragment();
        dialogFragment.show(getSupportFragmentManager(), YourDialogFragment.class.getSimpleName());
    }