如何向前一个Fragment回传信息?
前言
我們使用Activity的時候,可以通過startActivityForResult來啟動一個新的Activity,然后在新的Activity中可以用setResult來向前一個Activity回傳一些結果信息,前一個Activity會在onActivityResult中得到這個信息。
那么當我們使用Fragment的形式來作為頁面的時候呢?我們知道可以使用setArguments向后面的Fragment傳遞信息,但是如何回傳結果信息?
setTargetFragment
Android提供了一種方式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,來看看它的源碼:
/*** Optional target for this fragment. This may be used, for example,* if this fragment is being started by another, and when done wants to* give a result back to the first. The target set here is retained* across instances via {@link FragmentManager#putFragment* FragmentManager.putFragment()}.** @param fragment The fragment that is the target of this one.* @param requestCode Optional request code, for convenience if you* are going to call back with {@link #onActivityResult(int, int, Intent)}.*/ 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; }/*** Return the target fragment set by {@link #setTargetFragment}.*/ final public Fragment getTargetFragment() {return mTarget; }/*** Return the target request code set by {@link #setTargetFragment}.*/ final public int getTargetRequestCode() {return mTargetRequestCode; }可以看到setTargetFragment會先進行兩輪校驗,首先保證前后兩個Fragment是同樣的FragmentManager,然后保證TargetFragment和當前Fragment不是同一個,所以setTargetFragment會更安全,而且Android已經提供了這套方式,我們就沒必要自己再實現了。
總結
以上是生活随笔為你收集整理的如何向前一个Fragment回传信息?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现一个通用的中英文排序工具
- 下一篇: 浅析webrtc中音频的录制和播放流程