这个问题已经出现了好几次,我已经阅读了所有的答案,但我还没有看到一个真正强大的方法来处理这个问题。在我的解决方案中,我正在使用来自调用Activity
的侦听器,AlertDialog
如下所示:
public class MyDialogFragment extends DialogFragment {
public interface MyDialogFragmentListener {
public void onReturnValue(String foo);
}
public void init(boolean someValue)
{
sSomeValue = someValue;
listeners = new ArrayList<MyDialogFragmentListener>();
}
static boolean sSomeValue;
private static ArrayList<MyDialogFragmentListener> listeners;
public void addMyDialogFragmentListener(MyDialogFragmentListener l)
{
listeners.add(l);
}
public void removeMyDialogFragmentListener(MyDialogFragmentListener l)
{
listeners.remove(l);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.title)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
for (MyDialogFragmentListener listener : listeners) {
listener.onReturnValue("some value");
}
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
// Nothing to do but exit
}
});
if (sSomeValue) {
builder.setMessage(R.string.some_value_message);
} else {
builder.setMessage(R.string.not_some_value_message);
}
// Create the AlertDialog object and return it
return builder.create();
}
}
然后在调用Activity
中,我正常实例化对象,传递任何参数init
并设置我的监听器。
这就是问题所在:当您在对话框打开时旋转设备并更改方向时,会重新创建Activity
和对象。MyDialogFragment
为了确保输入值不会搞砸,我将初始化值设置为static
. 这对我来说感觉很奇怪,但由于一次只会有一个这样的对话,我可以接受。问题出在返回值上。原始侦听器将被调用。这很好,因为对象仍然存在,但如果需要更新Activity
(存在)上的 UI,它不会被更新,因为新 Activity
实例现在正在控制 UI。
我正在考虑的一种解决方案是getActivity()
将对话框类强制转换为 myActivity
并强制对话框本身添加一个侦听器,而不是让调用Activity
来执行它。但这只是感觉就像黑客滚雪球一样。
优雅地处理这个问题的最佳实践是什么?