在Android中,当设备的配置更改(如旋转屏幕或语言更改)时,Activity对象将被销毁并重新创建。如果在Activity中使用对话框并为其设置监听器,则在重新创建Activity时可能会丢失监听器的引用。
为了避免这个问题,可以使用Fragment来代替对话框,因为Fragment不会被销毁并重新创建。另外,可以将对话框的监听器定义为Activity的内部类,这样可以确保引用不会丢失。
以下是一个使用Fragment的示例代码:
public class MainActivity extends AppCompatActivity {
private MyDialogFragment mDialogFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDialogFragment = new MyDialogFragment();
mDialogFragment.show(getSupportFragmentManager(), "dialog");
}
public void onDialogPositiveClick() {
// Handle positive click event
}
public void onDialogNegativeClick() {
// Handle negative click event
}
public static class MyDialogFragment extends DialogFragment {
private DialogInterface.OnClickListener mListener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof MainActivity) {
mListener = (MainActivity) context;
} else {
throw new RuntimeException(context.toString() + " must implement MyDialogFragmentListener");
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage("Are you sure you want to do this?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mListener.onDialogPositiveClick();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mListener.onDialogNegativeClick();
}
});
return builder.create();
}
}
}
在上面的代码中,我们创建了一个名为“ MyDialogFragment”的Fragment,它代表对话