尝试在实现LoaderCallbacks接口的Fragment的onLoadFinished方法中显示DialogFragment时收到异常。基本上我使用LoaderCallbacks从休息服务获取一些数据,然后在onLoadFinished上我试图显示一个包含ListVeiw的自定义DialogFragment,以允许用户进行选择。除非我尝试从onLoadFinished中启动对话框,否则一切都很有效。我怎样才能实现这一目标......这是解决问题的正确方法。
这是我想要做的一个例子:
public class EventFragment extends Fragment implements LoaderCallbacks<someresponse> {
@Override
public void onLoadFinished(Loader<someresponse> arg0, someresponse data) {
//an exception is generated when trying to launch a dialog fragment from
//within the onLoadFinished
FragmentManager manager = getFragmentManager();
ListViewDialogFragment dialog = ListViewDialogFragment.newInstance(data);
dialog.show(manager, "event_list_dialog");
}
}
谢谢!
答案 0 :(得分:5)
经过一些研究,我确定我的方法不正确。您永远不应该尝试从LoaderCallbacks异步任务的onLoadFinished方法中启动新片段。框架试图阻止您执行此操作,因为实现LoaderCallbacks的当前运行的片段或活动的状态是不确定的,因此在异步任务完成时不能保证存在。
此外,尝试将处理对话框状态和数据显示状态分成两个单独的片段,这与Android框架支持的MVC设计模式有点相反。也就是说,我的新方法包括动态更改片段实现LoaderCallbacks的视图以隐藏或显示特定的线性布局,一个用于过程指示器,另一个用于显示数据。这种方法让我修改了一个现有的片段,而不是启动一个效果很好的新片段。
这是一个最终让我清晰的讨论链接。
https://groups.google.com/forum/#!topic/android-developers/dXZZjhRjkMk/discussion
答案 1 :(得分:1)
您定义的方法非常好,除了一个案例 - 如果您的活动已经从屏幕上消失,加载操作完成后会发生什么?在这种情况下它将如何显示对话框?
所以一般来说,如果你能说出你得到的确切异常,我将不胜感激。 但是,作为一般方法,检查保持片段的活动是否仍处于最顶层或甚至是否完成可能是有用的。 更好的是 - 你应该考虑在活动/片段破坏时取消所有后台操作,在这种情况下,你可以毫不费力地显示对话框。
祝你好运!