我们使用Activity的时候,可以通过startActivityForResult来启动一个新的Activity,然后在新的Activity中可以用setResult来向前一个Activity回传一些结果信息,前一个Activity会在onActivityResult中得到这个信息。
那么当我们使用Fragment的形式来作为页面的时候呢?我们知道可以使用setArguments向后面的Fragment传递信息,但是如何回传结果信息?
setTargetFragmentAndroid提供了一种方式setTargetFragment
public void setTargetFragment(Fragment fragment, int requestCode)
将前一个Fragment设置给后面的Fragment,然后就可以通过getTargetFragment()和getTargetRequestCode()来获取对应的Fragment和Code。
当我们需要回传信息的时候,就可以调用onActivityResult即可,如下:
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intentData);
这样前一个Fragment就可以在它的onActivityResult处理这些回传信息。
上面可以发现其实就是将前一个Fragment对象交给后面的Fragment持有而已,我们自己创建一个set函数其实也可以实现,但是还是推荐使用Android提供的setTargetFragment,来看看它的源码:
public void setTargetFragment(Fragment fragment, int requestCode) { // Don't allow a caller to set a target fragment in another FragmentManager, // but there's a snag: people do set target fragments before fragments get added. // We'll have the FragmentManager check that for validity when we move // the fragments to a valid state. final FragmentManager mine = getFragmentManager(); final FragmentManager theirs = fragment != null ? fragment.getFragmentManager() : null; if (mine != null && theirs != null && mine != theirs) { throw new IllegalArgumentException("Fragment " + fragment + " must share the same FragmentManager to be set as a target fragment"); } // Don't let someone create a cycle. for (Fragment check = fragment; check != null; check = check.getTargetFragment()) { if (check == this) { throw new IllegalArgumentException("Setting " + fragment + " as the target of " + this + " would create a target cycle"); } } mTarget = fragment; mTargetRequestCode = requestCode; } final public Fragment getTargetFragment() { return mTarget; } final public int getTargetRequestCode() { return mTargetRequestCode; }
可以看到setTargetFragment会先进行两轮校验,首先保证前后两个Fragment是同样的FragmentManager,然后保证TargetFragment和当前Fragment不是同一个,所以setTargetFragment会更安全,而且Android已经提供了这套方式,我们就没必要自己再实现了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)