【发布时间】:2014-07-31 20:37:32
【问题描述】:
我想启动一个带有自定义布局的对话框,我通过 DialogFragment 实现了该布局。 (我基本上只是更改了 onCreateView() 并添加了按钮处理程序)。该对话框让用户可以快速更改重要设置。
此对话框将从几个不同的活动中启动。不同的活动没有太多共同点,只是它们需要在用户更改设置后刷新。他们不需要从对话框中获取任何信息;他们只需要知道它何时关闭(解雇)。
我的尝试
我尝试在 onResume() 中刷新活动,但启动和关闭对话框似乎从未调用此方法。 (所以我不确定它为什么存在,但这可能是另一个问题的主题。)
接下来,我尝试在对话框中添加一个 DialogInterface.OnDismissListener:
public static void showMyDialog(OnDismissListener listener, Activity activity)
{
DialogFragment fragment = new MyDialogFragment();
fragment.show(activity.getFragmentManager(), "date");
activity.getFragmentManager().executePendingTransactions();//A
fragment.getDialog().setOnDismissListener(listener);//B
}
当我最初忽略 A 行时,我在 B 行得到了 NullPointerException,因为此时对话框为空。按照this SO answer 的建议,我调用了executePendingTransaction()。这会导致 B 行出现 IllegalStateException,并显示消息“OnDismissListener 已被 DialogFragment 占用,无法替换。”我还尝试在调用 show() 之前放置 setOnDismissListener(),但这总是会导致 NullPointerException。
然后我阅读了this other SO answer,它说最初的提问者“在 DialogFragment 的生命周期中过早调用 getDialog()”。所以我尝试向我的 DialogFragment 添加一个构造函数:
public MyDialogFragment(SomeCallback illTakeAnythingICanGet)
{
//I'll store the callback here and call it later
}
不幸的是,添加一个构造函数让 Android Lint 吓坏了,出现了一个致命的警告,当我查看它时,我在 this question 中发现了一条评论,似乎说这种方法将无法处理用户旋转对话框打开时的屏幕。
问题
如果用户旋转屏幕,Activity 如何确定 DialogFragment 何时关闭(被解除),并且不会破坏我的应用程序?除了 DialogFragment 之外,我还应该使用其他东西吗?
【问题讨论】:
-
是否有必要 Activity 完成工作并试图找出对话框的状态?当它关闭时,从 DialogFragment 向其所有者 Activity 发送通知可能会更容易。即如果 SomeCallback 是带有回调方法的接口,则在需要通知的活动中实现它。在 DialogFragment 中,您可以覆盖 onDismiss(DialogInterface) 以检查 getActivity() 是否返回 SomeCallback 的实例 - 如果是 - 调用接口方法。
-
我刚刚从片段中创建了一个界面,这与@harism 所说的相同。 stackoverflow.com/questions/24149696/…
-
@harism 是有道理的;有机会我会试试这个。
-
harism 的独奏对我有用。我还没有代表将其发布为答案。