下面列出了android.support.v4.app.FragmentManager#getFragments ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* 根据栈参数获取所有fragment
* <p>需之前对fragment的操作都借助该工具类</p>
*
* @param fragmentManager fragment管理器
* @param result 结果
* @param isInStack 是否是栈中的
* @return 栈中所有fragment
*/
private static List<FragmentNode> getAllFragmentsIsInStack(@NonNull FragmentManager fragmentManager,
List<FragmentNode> result,
boolean isInStack) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) {
return Collections.emptyList();
}
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null) {
if (isInStack) {
if (fragment.getArguments().getBoolean(ARGS_IS_ADD_STACK)) {
result.add(new FragmentNode(fragment, getAllFragmentsIsInStack(fragment.getChildFragmentManager(), new ArrayList<FragmentNode>(), true)));
}
} else {
result.add(new FragmentNode(fragment, getAllFragmentsIsInStack(fragment.getChildFragmentManager(), new ArrayList<FragmentNode>(), false)));
}
}
}
return result;
}
/**
* 根据栈参数获取同级别fragment
*
* @param fragmentManager fragment管理器
* @param isInStack 是否是栈中的
* @return 栈中同级别fragment
*/
private static List<Fragment> getFragmentsIsInStack(@NonNull FragmentManager fragmentManager, boolean isInStack) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) return Collections.emptyList();
List<Fragment> result = new ArrayList<>();
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null) {
if (isInStack) {
if (fragment.getArguments().getBoolean(ARGS_IS_ADD_STACK)) {
result.add(fragment);
}
} else {
result.add(fragment);
}
}
}
return result;
}
/**
* 根据栈参数获取同级别fragment
*
* @param fragmentManager fragment管理器
* @param isInStack 是否是栈中的
* @return 栈中同级别fragment
*/
private static List<Fragment> getFragmentsIsInStack(@NonNull FragmentManager fragmentManager, boolean isInStack) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) {
return Collections.emptyList();
}
List<Fragment> result = new ArrayList<>();
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null) {
if (isInStack) {
if (fragment.getArguments().getBoolean(ARGS_IS_ADD_STACK)) {
result.add(fragment);
}
} else {
result.add(fragment);
}
}
}
return result;
}
@SuppressLint("RestrictedApi")
private static Pair<Method, Object> findMethodInFragmentManager(FragmentManager fragmentManager, Class<?> resultType,
Class<? extends TaskResult> annotation, Task<?> task, boolean compareFragmentIndex) {
if (fragmentManager == null) {
return null;
}
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null) {
return null;
}
for (Fragment childFragment : fragments) {
if (childFragment == null || childFragment.getActivity() == null) {
continue;
}
Pair<Method, Object> pair = findMethodInFragment(childFragment, childFragment.getClass(), resultType, annotation, task, compareFragmentIndex);
if (pair != null) {
return pair;
}
}
return null;
}
/**
* 根据栈参数获取同级别fragment
*
* @param fragmentManager fragment管理器
* @param isInStack 是否是栈中的
* @return 栈中同级别fragment
*/
private static List<Fragment> getFragmentsIsInStack(@NonNull final FragmentManager fragmentManager, final boolean isInStack) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) return Collections.emptyList();
List<Fragment> result = new ArrayList<>();
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null) {
if (isInStack) {
if (fragment.getArguments().getBoolean(ARGS_IS_ADD_STACK)) {
result.add(fragment);
}
} else {
result.add(fragment);
}
}
}
return result;
}
/**
* 根据栈参数获取所有fragment
* <p>需之前对fragment的操作都借助该工具类</p>
*
* @param fragmentManager fragment管理器
* @param result 结果
* @param isInStack 是否是栈中的
* @return 栈中所有fragment
*/
private static List<FragmentNode> getAllFragmentsIsInStack(@NonNull final FragmentManager fragmentManager,
final List<FragmentNode> result,
final boolean isInStack) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) return Collections.emptyList();
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null) {
if (isInStack) {
if (fragment.getArguments().getBoolean(ARGS_IS_ADD_STACK)) {
result.add(new FragmentNode(fragment, getAllFragmentsIsInStack(fragment.getChildFragmentManager(), new ArrayList<FragmentNode>(), true)));
}
} else {
result.add(new FragmentNode(fragment, getAllFragmentsIsInStack(fragment.getChildFragmentManager(), new ArrayList<FragmentNode>(), false)));
}
}
}
return result;
}
protected void recoverFragment(String currentFragmentTag) {
if (currentFragmentTag == null) {
return;
}
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
List<Fragment> fragments = fm.getFragments();
for (Fragment fragment : fragments) {
if (fragment.getTag().equals(currentFragmentTag)) {
ft.show(fragment);
} else {
ft.hide(fragment);
}
}
ft.commitAllowingStateLoss();
Fragment current = fm.findFragmentByTag(currentFragmentTag);
switchFragment(current);
}
/**
* 处理fragment回退键
* <p>如果fragment实现了OnBackClickListener接口,返回{@code true}: 表示已消费回退键事件,反之则没消费</p>
* <p>具体示例见FragmentActivity</p>
*
* @param fragmentManager fragment管理器
* @return 是否消费回退事件
*/
public static boolean dispatchBackPress(@NonNull FragmentManager fragmentManager) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) return false;
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null
&& fragment.isResumed()
&& fragment.isVisible()
&& fragment.getUserVisibleHint()
&& fragment instanceof OnBackClickListener
&& ((OnBackClickListener) fragment).onBackClick()) {
return true;
}
}
return false;
}
@SuppressLint("RestrictedApi")
private static String getIndex(Fragment fragment) {
String index;
if (fragment.getParentFragment() != null) {
index = getIndex(fragment.getParentFragment()) + "-";
} else {
index = "";
}
FragmentManager fragmentManager = fragment.getFragmentManager();
if (fragmentManager != null) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments != null && !fragments.isEmpty()) {
for (int i = 0; i < fragments.size(); i++) {
if (fragment.equals(fragments.get(i))) {
index += i;
break;
}
}
}
}
return index;
}
/**
* 处理fragment回退键
* <p>如果fragment实现了OnBackClickListener接口,返回{@code true}: 表示已消费回退键事件,反之则没消费</p>
* <p>具体示例见FragmentActivity</p>
*
* @param fragmentManager fragment管理器
* @return 是否消费回退事件
*/
public static boolean dispatchBackPress(@NonNull FragmentManager fragmentManager) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty())
return false;
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null
&& fragment.isResumed()
&& fragment.isVisible()
&& fragment.getUserVisibleHint()
&& fragment instanceof OnBackClickListener
&& ((OnBackClickListener) fragment).onBackClick()) {
return true;
}
}
return false;
}
/**
* 根据栈参数获取所有fragment
* <p>需之前对fragment的操作都借助该工具类</p>
*
* @param fragmentManager fragment管理器
* @param result 结果
* @param isInStack 是否是栈中的
* @return 栈中所有fragment
*/
private static List<FragmentNode> getAllFragmentsIsInStack(@NonNull FragmentManager fragmentManager,
List<FragmentNode> result,
boolean isInStack) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) return Collections.emptyList();
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null) {
if (isInStack) {
if (fragment.getArguments().getBoolean(ARGS_IS_ADD_STACK)) {
result.add(new FragmentNode(fragment, getAllFragmentsIsInStack(fragment.getChildFragmentManager(), new ArrayList<FragmentNode>(), true)));
}
} else {
result.add(new FragmentNode(fragment, getAllFragmentsIsInStack(fragment.getChildFragmentManager(), new ArrayList<FragmentNode>(), false)));
}
}
}
return result;
}
/**
* 处理fragment回退键
* <p>如果fragment实现了OnBackClickListener接口,返回{@code true}: 表示已消费回退键事件,反之则没消费</p>
* <p>具体示例见FragmentActivity</p>
*
* @param fragmentManager fragment管理器
* @return 是否消费回退事件
*/
public static boolean dispatchBackPress(@NonNull FragmentManager fragmentManager) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null || fragments.isEmpty()) {
return false;
}
for (int i = fragments.size() - 1; i >= 0; --i) {
Fragment fragment = fragments.get(i);
if (fragment != null
&& fragment.isResumed()
&& fragment.isVisible()
&& fragment.getUserVisibleHint()
&& fragment instanceof OnBackClickListener
&& ((OnBackClickListener) fragment).onBackClick()) {
return true;
}
}
return false;
}
public static boolean isCurrentFragment(FragmentManager fragmentManager,
Class<? extends Fragment> clazz) {
Fragment fragment = null;
List<Fragment> fragments = fragmentManager.getFragments();
int index = fragments.size();
while (fragment == null && index >= 0) {
index--;
fragment = fragments.get(index);
}
return fragment != null && fragment.getClass().equals(clazz);
}
/**
* show()、hide()场景下,当前fragment没隐藏,如果其子fragment也没隐藏,则尝试让子fragment请求数据
*/
private void dispatchParentHiddenState() {
FragmentManager fragmentManager = getChildFragmentManager();
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments.isEmpty()) {
return;
}
for (Fragment child : fragments) {
if (child instanceof LazyLoadFragment && !((LazyLoadFragment) child).isHidden) {
((LazyLoadFragment) child).tryLoadData1();
}
}
}
private static void deAttachAllFragments(ActionBarActivity act){
FragmentManager fragmentManager = act.getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null) return;
for(Fragment fragment : fragments){
if (fragment.isVisible())
ft.hide(fragment);
}
ft.commitAllowingStateLoss();
}
/**
* ViewPager场景下,当前fragment可见,如果其子fragment也可见,则尝试让子fragment加载请求
*/
private void dispatchParentVisibleState() {
FragmentManager fragmentManager = getChildFragmentManager();
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments.isEmpty()) {
return;
}
for (Fragment child : fragments) {
if (child instanceof LazyLoadFragment && ((LazyLoadFragment) child).isVisibleToUser) {
((LazyLoadFragment) child).tryLoadData();
}
}
}
@Nullable public static Fragment getVisibleFragment(@NonNull FragmentManager manager) {
List<Fragment> fragments = manager.getFragments();
if (fragments != null && !fragments.isEmpty()) {
for (Fragment fragment : fragments) {
if (fragment != null && fragment.isVisible()) {
Logger.e(fragment.getClass().getSimpleName(), fragment.isVisible());
return fragment;
}
}
}
return null;
}
public void clearBackStackFragmets()
{
/* if (1==1)
return;*/
try {
// in my case I get the support fragment manager, it should work with the native one too
FragmentManager fragmentManager = mActivity.getSupportFragmentManager();
// this will clear the back stack and displays no animation on the screen
fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
// fragmentManager.popBackStackImmediate(SplashFragment.class.getCanonicalName(),FragmentManager.POP_BACK_STACK_INCLUSIVE);
List<Fragment> fragmentList = fragmentManager.getFragments();
if (fragmentList != null && !fragmentList.isEmpty())
{
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
for (Fragment fragment : fragmentList)
{
if (fragment != null)
{
fragmentTransaction.remove(fragment);
}
}
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragmentTransaction.commit();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
@SuppressLint("RestrictedApi")
private Fragment findFragment(FragmentManager manager) {
if (manager == null) {
return null;
}
List<Fragment> fragments = manager.getFragments();
if (fragments == null) {
return null;
}
for (Fragment fragment : fragments) {
if (fragment == null) {
continue;
}
String fragmentId = FragmentIdHelper.getFragmentId(fragment);
if (mFragmentId.equals(fragmentId)) {
return fragment;
}
if (FragmentHack.getChildFragmentManager(fragment) != null) {
Fragment child = findFragment(FragmentHack.getChildFragmentManager(fragment));
if (child != null) {
return child;
}
}
}
return null;
}
/**
* 恢复嵌套的Fragment
*/
public void restoreChildFragment(Fragment currentFragment) {
FragmentManager fm = currentFragment.getFragmentManager();
List<Fragment> fragmentList = fm != null ? fm.getFragments() : null;
if (CollectionUtil.isEmpty(fragmentList)) {
return;
}
for (Fragment fragment : fragmentList) {
fragment.onAttach((Context)context);
}
}