Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在内存不足时终止DialogFragment后重新创建它_Android_Android Dialogfragment - Fatal编程技术网

Android 在内存不足时终止DialogFragment后重新创建它

Android 在内存不足时终止DialogFragment后重新创建它,android,android-dialogfragment,Android,Android Dialogfragment,我的对话框片段有一个监听器,我从一些活动或片段 因此,对于下面的当前代码,如果我打开此对话框,然后转到后台并将其放置很长时间或设备内存不足,则该对话框将被清除。 然后,当我再次打开应用程序并按下btnOK,我将得到NullPointerException,因为listener=null public class Dialog extends DialogFragment { DialogListener listener; public static Dialog newIns

我的
对话框片段
有一个监听器,我从一些
活动
片段

因此,对于下面的当前代码,如果我打开此对话框,然后转到后台并将其放置很长时间或设备内存不足,则该对话框将被清除。
然后,当我再次打开应用程序并按下
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()
中的对话框,因此我担心如果在某些情况下我不处理用户,就永远无法打开该对话框。

任何帮助或建议都将不胜感激。

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

只需将其添加到对话框片段中

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

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());
    }

我们不能这样做。如果我们在onSaveInstanceState(…)中关闭对话框,我们将得到java.lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作这不是一个好的做法,如果您想在
onSaveInstanceState()
中关闭对话框,您可以在
onPause()
中执行,而不允许状态丢失