android Fragment管理

针对单个附着于单个Activity的若干个fragment,有时候我们需要获取当前的fragment对象,对某个的fragment对象进行处理,此时,就需要一个管理fragment的类了
完整代码:

public class FragmentListManager {

    private List<Fragment> fragmentList;

    public static FragmentListManager getInstance() {
        return FragmentListHolder.instance;
    }

    private static class FragmentListHolder {
        public static final FragmentListManager instance = new FragmentListManager();
    }

    private FragmentListManager() {
        fragmentList = new ArrayList<>();
    }

    public List<Fragment> getFragmentList() {
        return fragmentList;
    }

    private void addFragment(Fragment fragment) {
        fragmentList.add(fragment);
    }

    public void removeFragment(Fragment fragment) {
        fragmentList.remove(fragment);
    }

    private Fragment getLastFragment() {
        if(fragmentList.size() >= 2) {
            return fragmentList.get(fragmentList.size() - 2);
        }
        return null;
    }

    public Fragment getCurrentFragment() {
        if(fragmentList.size() >= 1) {
            return fragmentList.get(fragmentList.size() - 1);
        }
        return null;
    }

    /**
     * 不希望在点击Tab时被remove掉的Fragment写在这
     */
    public void clearOtherFragment(FragmentManager fm) {
        Set<Fragment> removeIndex = new ArraySet<>();
        Log.d("FragmentListManager", "fragmentList.size():" + fragmentList.size());
        for(int i = 0; i < fragmentList.size(); i++) {
            fm.beginTransaction().remove(fragmentList.get(i)).commit();
            removeIndex.add(fragmentList.get(i));
        }
        for(Fragment fragment : removeIndex) {
            Log.d("FragmentListManager", "fragment:" + fragment);
            fragmentList.remove(fragment);
        }
    }

    public void go2Fragment(Fragment fragment, FragmentManager fm, Bundle argument) {

        //防止重复点击
        if(fragment == getCurrentFragment()) {
            return;
        }

        //若之前就包含该Fragment,将该Fragment偶从list中remove掉,并重新add到最前边
        if(fragmentList.contains(fragment)) {
            removeFragment(fragment);
        }
        FragmentTransaction transaction = fm.beginTransaction();
        if (!fragment.isStateSaved()) {
            fragment.setArguments(argument);
        }
        if(!fragment.isAdded()) {
            transaction.add(R.id.fl_main, fragment);
        }

        if(getCurrentFragment() != null) {
            transaction.hide(getCurrentFragment());
        }
        transaction.show(fragment).commitAllowingStateLoss();
        addFragment(fragment);
    }

    /**
     * 返回到上一层级的Fragment
     */
    public boolean back2LastFragment(FragmentManager fm) {
        FragmentTransaction transaction = fm.beginTransaction();
        Fragment lastFragment = getLastFragment();
        if(lastFragment == null) {
            return false;
        }
        if(!lastFragment.isAdded()) {
            transaction.add(R.id.fl_main, lastFragment);
        }
        transaction.show(lastFragment);
        //如果静态引用未去掉,在内存上仍会存在,所以得在Fragment中的onDestroy去掉.
        transaction.remove(getCurrentFragment()).commit();
        removeFragment(getCurrentFragment());
        return true;
    }

    /**
     * 返回到上一层级的Fragment
     */
    public boolean back2LastFragmentWithoutRemove(FragmentManager fm) {
        FragmentTransaction transaction = fm.beginTransaction();
        Fragment lastFragment = getLastFragment();
        if(lastFragment == null) {
            return false;
        }
        if(!lastFragment.isAdded()) {
            transaction.add(R.id.fl_main, lastFragment);
        }
        transaction.show(lastFragment);
        //如果静态引用未去掉,在内存上仍会存在,所以得在Fragment中的onDestroy去掉.
        transaction.hide(getCurrentFragment()).commit();
        removeFragment(getCurrentFragment());
        return true;
    }

    public void onAppExit(){
        fragmentList.clear();
    }

}

补充:转自Android应用开发—FragmentManager如何管理fragments

FragmentManager:

为了管理Activity中的fragments,需要使用FragmentManager。可以通过调用getFragmentManager()或者 getSupportFragmentManager()获取FragmentManager。
如果你在Fragment里获取FragmentManager,调用getFragmentManager()即可

Fragment Transactions:

使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。所有这些改变构成一个集合,这个集合被叫做一个transaction。

如何获取FragmentTransaction类的实例:

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

每个transaction是一组同时执行的变化的集合。用add(), remove(), replace()方法,把所有需要的变化加进去,然后调用commit()方法,将这些变化应用。
在commit()方法之前,你可以调用addToBackStack(),把这个transaction加入back stack中去,这个back stack是由activity管理的,当用户按返回键时,就会回到上一个fragment的状态。比如下面的代码就是用一个新的fragment取代之前的fragment,并且将前次的状态存储在back stack中。

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

在这个例子中:

newFragment将取代在R.id.fragment_container容器中的fragment,如果没有,将直接添加新的fragment。
通过调用addToBackStack(),commit()的一系列转换作为一个transaction被存储在back stack中,用户按Back键可以返回上一个转换前的状态。
当你移除一个fragment的时候,如果commit()之前没有调用addToBackStack(),那个fragment将会是destroyed;如果调用了addToBackStack(),这个fragment会是stopped,可以通过返回键来恢复。

commit()方法:

调用commit()方法并不能立即执行transaction中包含的改变动作,commit()方法把transaction加入activity的UI线程队列中。但是,如果觉得有必要的话,可以调用executePendingTransactions()方法来立即执行commit()提供的transaction。(这样做通常是没有必要的,除非这个transaction被其他线程依赖。)

注意:你只能在activity存储它的状态(当用户要离开activity时)之前调用commit(),如果在存储状态之后调用commit(),将会抛出一个异常。这是因为当activity再次被恢复时commit之后的状态将丢失。如果丢失也没关系,那么使用commitAllowingStateLoss()方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值