package com.wangbb.naruto.app.fragment; import android.content.Intent; import android.support.v4.app.Fragment; import android.util.SparseIntArray; import java.lang.reflect.Field; import java.util.List; /** * User: qii Date: 13-9-8 * <p/> * see https://code.google.com/p/android/issues/detail?id=40537 * <p/> * nested fragment wont receive onActivityResult, 2013.9.8 */ public class FixedOnActivityResultBugFragment extends Fragment { private final SparseIntArray mRequestCodes = new SparseIntArray(); /** * Registers request code (used in * {@link #startActivityForResult(android.content.Intent, int)}). * * @param requestCode * the request code. * @param id * the fragment ID (can be {@link Fragment#getId()} of * {@link Fragment#hashCode()}). */ public void registerRequestCode(int requestCode, int id) { mRequestCodes.put(requestCode, id); }// registerRequestCode() @Override public void startActivityForResult(Intent intent, int requestCode) { if (getParentFragment() instanceof FixedOnActivityResultBugFragment) { ((FixedOnActivityResultBugFragment) getParentFragment()) .registerRequestCode(requestCode, hashCode()); getParentFragment().startActivityForResult(intent, requestCode); } else { super.startActivityForResult(intent, requestCode); } }// startActivityForResult() @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (!checkNestedFragmentsForResult(requestCode, resultCode, data)) super.onActivityResult(requestCode, resultCode, data); }// onActivityResult() /** * Checks to see whether there is any children fragments which has been * registered with {@code requestCode} before. If so, let it handle the * {@code requestCode}. * * @param requestCode * the code from {@link #onActivityResult(int, int, android.content.Intent)}. * @param resultCode * the code from {@link #onActivityResult(int, int, android.content.Intent)}. * @param data * the data from {@link #onActivityResult(int, int, android.content.Intent)}. * @return {@code true} if the results have been handed over to some child * fragment. {@code false} otherwise. */ protected boolean checkNestedFragmentsForResult(int requestCode, int resultCode, Intent data) { final int id = mRequestCodes.get(requestCode); if (id == 0) return false; mRequestCodes.delete(requestCode); List<Fragment> fragments = getChildFragmentManager().getFragments(); if (fragments == null) return false; for (Fragment fragment : fragments) { if (fragment.hashCode() == id) { fragment.onActivityResult(requestCode, resultCode, data); return true; } } return false; }// checkNestedFragmentsForResult() @Override public void onDetach() { super.onDetach(); try { Field childFragmentManager = Fragment.class .getDeclaredField("mChildFragmentManager"); childFragmentManager.setAccessible(true); childFragmentManager.set(this, null); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } }