我的DialogFragment
有一个侦听器,我从某个Activity
或Fragment
传递它。
因此,使用下面的当前代码,如果我打开此对话框然后转到后台并将其长时间放置或设备放在内存不足上,对话框将清晰。
然后当我再次打开应用程序并按 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();
}
}
为了防止它,我将在重新创建对话片段时将其关闭。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState != null){
dismiss();
}
}
它在片段破坏和重新创建的情况下效果很好,但我不知道这个解决方案是否适用于所有情况? 我关闭了onCreate()
里面的对话框,所以我担心如果在某些情况下我不处理用户永远无法打开对话框。
任何帮助或建议将不胜感激。
如果活动被销毁,您可以关闭该对话框。
只需将其添加到对话框片段中即可。
@Override
public void onSaveInstanceState(Bundle outState) {
dismissAllowingStateLoss();
super.onSaveInstanceState(outState);
}
listener
为 null 的原因是您使用 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());
}