public static void fixActiveFragment(FragmentManager fragmentManager, Fragment fragment) {
   FragmentManagerImpl fm = (FragmentManagerImpl) fragmentManager;
   boolean needMatch = false;
   Fragment willRemoveFrag = null;
   if (fm.mActive != null) {
     int index = fragment.mIndex;
     if (index < 0) {
       Log.e(TAG, String.format("Fragment mIndex %s < 0 ! Origin: %s", fragment.mIndex, fragment));
       fragment.getFragmentManager().beginTransaction().remove(fragment).commit();
       return;
     }
     Fragment origin = fm.mActive.get(index);
     if (origin != null) {
       if ((origin.mIndex != fragment.mIndex) || !(origin.equals(fragment))) {
         Log.e(
             TAG,
             String.format(
                 "Fragment isn't equal! Origin: %s %s, Fragment: %s %s",
                 origin.toString(), origin.mIndex, fragment.toString(), fragment.mIndex));
         ArrayList<Integer> indexArray = new ArrayList<>();
         for (Fragment f : fm.mAdded) {
           if (indexArray.contains(f.mIndex)) {
             willRemoveFrag = origin;
             break;
           }
           indexArray.add(f.mIndex);
         }
       }
     }
     fm.mActive.set(index, fragment);
     if (willRemoveFrag != null) {
       // 2016.01.26 Fix bug mAdded not match
       // 瀏覽所有Fragment後,轉至後瀏覽其他Fragment會產生衝突
       fm.mAdded.remove(willRemoveFrag);
     }
     // 如往回跳的話會發現沒有執行
     // 1~5 is Fragment
     // 1 2 3 4 5 -> 3
     // 1 2 3 -> 1
     // v25.0.0 Fix fragment didn't run, if through step 1, 2, 3 then go back to 1, step 1 fragment
     // didn't run
     if (fragment.getUserVisibleHint() && !fragment.isResumed()) {
       if (!FragmentUtils.isStateLoss(fragment.getFragmentManager())) {
         fragment
             .getFragmentManager()
             .beginTransaction()
             .detach(fragment)
             .attach(fragment)
             .commit();
       }
     }
   }
 }
Example #2
0
  public static boolean tryForeachFragment(
      @NonNull final FragmentManager fragmentManager,
      @NonNull final Func1<AbstractBaseFragment, Boolean> actionOnChild,
      final boolean onlyForResumed) {
    if (fragmentManager.getFragments() == null) {
      return false;
    }

    boolean result = false;
    for (final Fragment fragment : fragmentManager.getFragments()) {
      if (fragment != null
          && (!onlyForResumed || fragment.isResumed())
          && fragment instanceof AbstractBaseFragment) {
        result = result || actionOnChild.call((AbstractBaseFragment) fragment);
      }
    }
    return result;
  }
Example #3
0
 public boolean isResumed() {
   return zzadh.isResumed();
 }