我正在用一个像DialogFragment
收回数据这样简单的想法来对抗几天。首先,我尝试将DialogFragment
作为嵌套类,但它在方向更改时失败了。然后我决定使用interfaces
将listener
传递给DialogFragment
,但是如果在listener
之后如何保留orientation change
则存在问题。然后,此处有人建议使用setTargetFragment()
,但由于known issue,它也无效。
这是一项常见的任务,你们如何从DialogFragment
获取数据。
答案 0 :(得分:5)
使用接口,并在onAttach(Activity)
中连接肯定有效,the example given by Google建议以这种方式在组件之间进行通信,但绝对有更好的方法。 Square推出了一个很好的解决方案,你可以在这里找到:
http://corner.squareup.com/2012/07/otto.html
这是一个事件总线,您可以注册接收事件通知,并真正解耦组件通信代码。
要从DialogFragment注册活动(例如,您已获得所需的数据,而您即将解散,因此您的活动会通知所有感兴趣的各方)您在活动中所做的一切都是:
bus.register(this);
然后在同一个Activity中你会有类似的东西:
@Subscribe
public void dataChanged(DataChangedEvent event) {
// TODO React to data.
}
然后DialogFragment只需要调用类似的东西:
bus.post(new DataChangedEvent(/*your data here*/));
将通知您的活动。没有将您的活动耦合到您的碎片,也没有跟踪听众。
答案 1 :(得分:3)
使用接口绝对是最好的方法。
在DialogFragment
中,在onAttach(Activity)
中注册听众,即使更改了方向,您也可以收到回调。
答案 2 :(得分:0)
每当您将逻辑活动附加到片段管理器时,请务必使用标记的附加参数。然后,在DialogFragment的onCreate
中,只需调用getFragmentManager().findFragmentByTag("parent fragment");
即可获得对父级的引用。