Android - getTargetFragment和setTargetFragment - 它们用于什么

时间:2013-09-01 17:41:39

标签: android android-fragments communication

我试着搜索,但我仍然有点失落。我通常会通过Activity via接口或BroadcastReceiver对片段进行片段分片。

无论如何,我的问题是getTargetFragment的用途是什么?有人可以提供一个用例或只是一个简单的例子,以便我能理解它的用法吗?

3 个答案:

答案 0 :(得分:42)

使用案例=由同一活动托管的2个片段。

startActivityForResult()建立2个活动之间的关系时,setTargetFragment()定义2个片段之间的调用/被调用关系。

setTargetFragment(target)让"调用"片段知道在哪里发送结果。在这种情况下,onActivityResult()会被手动调用。

public class Caller extends Fragment
     Fragment called = Called.newInstance()
     called.setTargetFragment(this)

public class Called extends DialogFragment
   intent = amazingData
   getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent)

答案 1 :(得分:10)

我终于找到了如何在片段中使用setTarget并想分享。当你想要从片段到​​片段进行通信时,它非常有用。

这是一个例子:假设你想要显示一个对话框,当它关闭时你想要做一些动作。

所以在你将使用对话框的fragment1中你可以这样做:

myDialogFragment.setTargetFragment(fragment1, myDialogFragment.REQ_CODE);

在调用对话框的片段中,您需要覆盖onActivityResult,如下所示:

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == CoDDialogFragment.REQ_CODE)
            exit(); //or whatever you want to do here
    }

在myDialogFragment中你可以这样做:

TellTargetYouGotResults(REQ_CODE);

//...
  private void TellTargetYouGotResults(int code) {
        Fragment targetFragment = getTargetFragment(); // fragment1 in our case
        if (targetFragment != null) {
            targetFragment.onActivityResult(getTargetRequestCode(), code, null);
        }
    }

其中REQ_CODE当然可以是任何int。对于片段到片段的通信非常有用。但我仍然更喜欢事件总线,因为有时在向目标发送数据后,它的视图可能已经被破坏(包含它的片段),然后如果你尝试更新onActivityResult中的视图,你将会崩溃。所以我说它只是传递数据但不更新UI很有用,除非你做了'添加'片段事务而不是替换(它破坏视图但保持状态)。

答案 2 :(得分:4)

从我能够从阅读文档中获取的是,这些方法是从另一个片段访问数据的另一种方式。这是我写的sample project,演示了使用这些方法的单个用例。我确定有更多的用例,但是......