Android - getTargetFragment 和 setTargetFragment - 它们的用途是啥

Posted

技术标签:

【中文标题】Android - getTargetFragment 和 setTargetFragment - 它们的用途是啥【英文标题】:Android - getTargetFragment and setTargetFragment - What are they used forAndroid - getTargetFragment 和 setTargetFragment - 它们的用途是什么 【发布时间】:2013-09-04 20:21:55 【问题描述】:

我试过搜索,但还是有点迷茫。我通常通过接口通过ActivityBroadcastReceiver 进行片段到片段的通信。

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

【问题讨论】:

***.com/a/13733914/1093872 这是另一个很好的例子......但接口也很好。 谢谢...它看起来只是一个片段的占位符。所以如果我有一个片段并且我设置了目标,那么我可以使用 getTarget 来检索片段。它类似于视图上的 setTag。 考虑使用 LocalBroadcastManager(这里:developer.android.com/reference/android/support/v4/content/…)代替 BroadcastReceiver,或者创建自己的事件处理机制。 【参考方案1】:

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

【讨论】:

【参考方案2】:

用例 = 由同一活动托管的 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)

【讨论】:

【参考方案3】:

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

【讨论】:

我不明白你想说什么“因为有时在将数据发送到目标后,它的视图可能已经被破坏(如果它是一个片段)”。当我调用getTargetFragment().onActivityResult() 时,我的应用程序很少遇到崩溃,因为getTargetFragment() 的返回值为空,但我无法重现此问题。所以我想让你更详细地描述一下,这部分句子的真正含义。 片段事务替换是通过添加到后台堆栈完成的......视图部分被破坏。只有片段的状态存在。视图再次膨胀。因此,如果在这两个片段之间进行通信,请注意不要删除它的视图部分,您知道它不存在。

以上是关于Android - getTargetFragment 和 setTargetFragment - 它们的用途是啥的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录