45

我试着搜索,但我还是有点迷茫。我通常Activity通过接口或BroadcastReceiver.

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

4

3 回答 3

54

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

wherestartActivityForResult()建立了 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)
于 2015-09-01T04:57:39.377 回答
15

我终于找到了如何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 很有用,除非你已经完成了“添加”片段事务而不是替换(这会破坏视图但保持状态)。

于 2017-08-10T11:45:44.367 回答
4

从阅读文档中我能了解到的是,这些方法是从另一个 Fragment 访问数据的另一种方式。这是我编写的一个示例项目,它演示了使用这些方法的单个用例。我敢肯定还有更多的用例......

于 2013-09-01T23:34:17.340 回答