Android的Fragment中onActivityResult不被调用的解决方案
最后更新 2021-02-02 15:05 星期二 所属:
安卓教程 浏览:583
普遍的,大家会在FragmentActivity中嵌入一层Fragment应用,乃至2次或双层Fragment嵌入应用。这个时候,在第二级或是更加深入等级的Fragment启用startActivityForResult方式时,将没法接到onActivityResult回调函数。阅读文章FragementActivity源代码后发觉,原来是源代码里沒有解决嵌入Fragment的状况,换句话说回调函数只到第一级Fragment,就沒有再次派发。我们可以完成一个自身的AppCompatActivity,来完成再次派发,以下:
public class CustomAppCompatActivity extends AppCompatActivity { private static final String TAG = "TAG"; /** * 重写onactivityresult方式,使二个或好几个fragment嵌入应用时要接到onactivityresut回调函数 * @param requestCode * @param resultCode * @param data */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { FragmentManager fm = getSupportFragmentManager(); int index = requestCode >> 16; if (index != 0) { index--; if (fm.getFragments() == null || index < 0 || index >= fm.getFragments().size()) { Log.w(TAG, "Activity result fragment index out of range: 0x" Integer.toHexString(requestCode)); return; } Fragment frag = fm.getFragments().get(index); if (frag == null) { Log.w(TAG, "Activity result no fragment exists for index: 0x" Integer.toHexString(requestCode)); } else { handleResult(frag, requestCode, resultCode, data); } return; } } /** * 递归调用,对全部子Fragement起效 * * @param frag * @param requestCode * @param resultCode * @param data */ private void handleResult(Fragment frag, int requestCode, int resultCode, Intent data) { frag.onActivityResult(requestCode & 0xffff, resultCode, data); List<Fragment> frags = frag.getChildFragmentManager().getFragments(); if (frags != null) { for (Fragment f : frags) { if (f != null) handleResult(f, requestCode, resultCode, data); } } } }
随后大家的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); }