常見的,我們會在FragmentActivity中嵌套一層Fragment使用,甚至兩次或多層Fragment嵌套使用。這個時候,在第二級或者更深級別的Fragment調用startActivityForResult方法時,將無法收到onActivityResult回調。閱讀FragementActivity源碼后發現,原來是源碼里沒有處理嵌套Fragment的情況,也就是說回調只到第一級Fragment,就沒有繼續分發。我們可以實現一個自己的AppCompatActivity,來實現繼續分發,如下:
1 public class CustomAppCompatActivity extends AppCompatActivity { 2 3 4 private static final String TAG = "TAG"; 5 6 7 /** 8 * 重寫onactivityresult方法,使二個或多個fragment嵌套使用時能收到onactivityresut回調 9 * @param requestCode 10 * @param resultCode 11 * @param data 12 */ 13 @Override 14 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 15 FragmentManager fm = getSupportFragmentManager(); 16 int index = requestCode >> 16; 17 if (index != 0) { 18 index--; 19 if (fm.getFragments() == null || index < 0 20 || index >= fm.getFragments().size()) { 21 Log.w(TAG, "Activity result fragment index out of range: 0x" 22 + Integer.toHexString(requestCode)); 23 return; 24 } 25 Fragment frag = fm.getFragments().get(index); 26 if (frag == null) { 27 Log.w(TAG, "Activity result no fragment exists for index: 0x" 28 + Integer.toHexString(requestCode)); 29 } else { 30 handleResult(frag, requestCode, resultCode, data); 31 } 32 return; 33 } 34 35 } 36 37 /** 38 * 遞歸調用,對所有子Fragement生效 39 * 40 * @param frag 41 * @param requestCode 42 * @param resultCode 43 * @param data 44 */ 45 private void handleResult(Fragment frag, int requestCode, int resultCode, 46 Intent data) { 47 frag.onActivityResult(requestCode & 0xffff, resultCode, data); 48 List<Fragment> frags = frag.getChildFragmentManager().getFragments(); 49 if (frags != null) { 50 for (Fragment f : frags) { 51 if (f != null) 52 handleResult(f, requestCode, resultCode, data); 53 } 54 } 55 } 56 57 }
然后我們的Activity繼承這個CustomAppCompatActivity即可,但是要注意,在Fragment中調用startActivityForResult時,一定要調用根Fragment的啟動方法,如下:
/** * 得到根Fragment * * @return */ private Fragment getRootFragment() { Fragment fragment = getParentFragment(); while (fragment.getParentFragment() != null) { fragment = fragment.getParentFragment(); } return fragment; } /** * 啟動Activity */ private void onClickTextViewRemindAdvancetime() { Intent intent = new Intent(); intent.setClass(getActivity(), YourActivity.class); intent.putExtra("TAG","TEST"); getRootFragment().startActivityForResult(intent, 1000); }
附上github: https://github.com/974648183/CustomAppCompatActivity-