@@ -29,14 +29,14 @@ private FragmentUtils() {
2929 throw new UnsupportedOperationException ("u can't instantiate me..." );
3030 }
3131
32- private static final int TYPE_ADD_FRAGMENT = 0x01 << 0 ;
32+ private static final int TYPE_ADD_FRAGMENT = 0x01 ;
3333 private static final int TYPE_REMOVE_FRAGMENT = 0x01 << 1 ;
3434 private static final int TYPE_REMOVE_TO_FRAGMENT = 0x01 << 2 ;
35- private static final int TYPE_REPLACE_FRAGMENT = 0x01 << 4 ;
35+ private static final int TYPE_REPLACE_FRAGMENT = 0x01 << 3 ;
36+ private static final int TYPE_POP_ADD_FRAGMENT = 0x01 << 4 ;
3637 private static final int TYPE_HIDE_FRAGMENT = 0x01 << 5 ;
3738 private static final int TYPE_SHOW_FRAGMENT = 0x01 << 6 ;
3839 private static final int TYPE_HIDE_SHOW_FRAGMENT = 0x01 << 7 ;
39- private static final int TYPE_POP_ADD_FRAGMENT = 0x01 << 8 ;
4040
4141 private static final String ARGS_ID = "args_id" ;
4242 private static final String ARGS_IS_HIDE = "args_is_hide" ;
@@ -110,6 +110,29 @@ public static Fragment addFragment(@NonNull FragmentManager fragmentManager,
110110 return operateFragment (fragmentManager , null , fragment , TYPE_ADD_FRAGMENT , sharedElement );
111111 }
112112
113+ /**
114+ * 新增多个fragment
115+ *
116+ * @param fragmentManager fragment管理器
117+ * @param fragments fragments
118+ * @param showIndex 要显示的fragment索引
119+ * @param containerId 布局Id
120+ * @return fragment
121+ */
122+ public static Fragment addFragments (@ NonNull FragmentManager fragmentManager ,
123+ @ NonNull List <Fragment > fragments ,
124+ int showIndex ,
125+ int containerId ) {
126+ for (int i = fragments .size () - 1 ; i >= 0 ; --i ) {
127+ Fragment fragment = fragments .get (i );
128+ if (fragment != null ) {
129+ putArgs (fragment , new Args (containerId , showIndex != i , false ));
130+ operateFragment (fragmentManager , null , fragment , TYPE_ADD_FRAGMENT );
131+ }
132+ }
133+ return fragments .get (showIndex );
134+ }
135+
113136 /**
114137 * 移除fragment
115138 *
@@ -162,7 +185,7 @@ public static void removeAllFragments(@NonNull FragmentManager fragmentManager)
162185 * @param srcFragment 源fragment
163186 * @param destFragment 目标fragment
164187 * @param isAddStack 是否入回退栈
165- * @return {@code null} 失败
188+ * @return 目标fragment
166189 */
167190 public static Fragment replaceFragment (@ NonNull Fragment srcFragment ,
168191 @ NonNull Fragment destFragment ,
@@ -281,6 +304,7 @@ public static Fragment popAddFragment(@NonNull FragmentManager fragmentManager,
281304 * 隐藏fragment
282305 *
283306 * @param fragment fragment
307+ * @return 隐藏的Fragment
284308 */
285309 public static Fragment hideFragment (@ NonNull Fragment fragment ) {
286310 Args args = getArgs (fragment );
@@ -290,10 +314,25 @@ public static Fragment hideFragment(@NonNull Fragment fragment) {
290314 return operateFragment (fragment .getFragmentManager (), null , fragment , TYPE_HIDE_FRAGMENT );
291315 }
292316
317+ /**
318+ * 隐藏同级别fragment
319+ *
320+ * @param fragmentManager fragment管理器
321+ */
322+ public static void hideFragments (@ NonNull FragmentManager fragmentManager ) {
323+ List <Fragment > fragments = getFragments (fragmentManager );
324+ if (fragments .isEmpty ()) return ;
325+ for (int i = fragments .size () - 1 ; i >= 0 ; --i ) {
326+ Fragment fragment = fragments .get (i );
327+ if (fragment != null ) hideFragment (fragment );
328+ }
329+ }
330+
293331 /**
294332 * 显示fragment
295333 *
296334 * @param fragment fragment
335+ * @return show的Fragment
297336 */
298337 public static Fragment showFragment (@ NonNull Fragment fragment ) {
299338 Args args = getArgs (fragment );
@@ -306,8 +345,9 @@ public static Fragment showFragment(@NonNull Fragment fragment) {
306345 /**
307346 * 先隐藏后显示fragment
308347 *
309- * @param hideFragment 需要hide的Fragment,如果为null则把栈中的fragment都隐藏
310- * @param showFragment 需要show的Fragment
348+ * @param hideFragment 需要隐藏的Fragment
349+ * @param showFragment 需要显示的Fragment
350+ * @return 显示的Fragment
311351 */
312352 public static Fragment hideShowFragment (@ NonNull Fragment hideFragment ,
313353 @ NonNull Fragment showFragment ) {
@@ -401,10 +441,14 @@ private static Fragment operateFragment(@NonNull FragmentManager fragmentManager
401441 ft .remove (fragment );
402442 }
403443 break ;
444+ case TYPE_REPLACE_FRAGMENT :
445+ ft .replace (args .getInt (ARGS_ID ), destFragment , name );
446+ if (args .getBoolean (ARGS_IS_ADD_STACK )) ft .addToBackStack (name );
447+ break ;
404448 case TYPE_POP_ADD_FRAGMENT :
405449 popFragment (fragmentManager );
406- if (args .getBoolean (ARGS_IS_ADD_STACK )) ft .addToBackStack (name );
407450 ft .add (args .getInt (ARGS_ID ), destFragment , name );
451+ if (args .getBoolean (ARGS_IS_ADD_STACK )) ft .addToBackStack (name );
408452 break ;
409453 case TYPE_HIDE_FRAGMENT :
410454 ft .hide (destFragment );
@@ -415,10 +459,6 @@ private static Fragment operateFragment(@NonNull FragmentManager fragmentManager
415459 case TYPE_HIDE_SHOW_FRAGMENT :
416460 ft .hide (srcFragment ).show (destFragment );
417461 break ;
418- case TYPE_REPLACE_FRAGMENT :
419- if (args .getBoolean (ARGS_IS_ADD_STACK )) ft .addToBackStack (name );
420- ft .replace (args .getInt (ARGS_ID ), destFragment , name );
421- break ;
422462 }
423463 ft .commitAllowingStateLoss ();
424464 return destFragment ;
@@ -451,7 +491,8 @@ public static Fragment getLastAddFragmentInStack(@NonNull FragmentManager fragme
451491 * @param isInStack 是否是栈中的
452492 * @return 栈中最后加入的fragment
453493 */
454- private static Fragment getLastAddFragmentIsInStack (@ NonNull FragmentManager fragmentManager , boolean isInStack ) {
494+ private static Fragment getLastAddFragmentIsInStack (@ NonNull FragmentManager fragmentManager ,
495+ boolean isInStack ) {
455496 List <Fragment > fragments = getFragments (fragmentManager );
456497 if (fragments .isEmpty ()) return null ;
457498 for (int i = fragments .size () - 1 ; i >= 0 ; --i ) {
0 commit comments