欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

Android Fragment切换不刷新不销毁的方法

程序员文章站 2022-02-07 12:24:56
...

90%以上的App都会用到Fragment、那么切换Fragment就很常见了、一般情况下我们在项目中需要进行Fragment的切换、一直都是用replace()方法来替换Fragment、比如入下代码

public void switchContent(Fragment fragment) {
    if(mContent != fragment) {
        mContent = fragment;
        mFragmentMan.beginTransaction()
            .setCustomAnimations(android.R.anim.fade_in, R.anim.slide_out)
            .replace(R.id.content_frame, fragment) // 替换Fragment,实现切换
            .commit();
    }
}


但是、这样会有一个问题、每次切换的时候、Fragment都会重新实例化、重新执行onCreateView()方法、重新加载一边数据、这样非常消耗性能和用户的数据流量、所以就在想、如何让多个Fragment彼此切换时不重新实例化?

翻看了Android官方Doc、和一些组件的源代码、发现replace()这个方法只是在上一个Fragment不再需要时采用的简便方法、正确的切换方式是add()、切换时hide()、add()另一个Fragment、再次切换时、只需hide()当前、show()另一个、这样就能做到多个Fragment切换不重新实例化、代码如下

public void switchContent(Fragment from, Fragment to) {
    if (mContent != to) {
        mContent = to;
        FragmentTransaction transaction = mFragmentMan.beginTransaction().setCustomAnimations(
                android.R.anim.fade_in, R.anim.slide_out);
        if (!to.isAdded()) {    // 先判断是否被add过
            transaction.hide(from).add(R.id.content_frame, to).commit(); // 隐藏当前的fragment,add下一个到Activity中
        } else {
            transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
        }
    }
}


使用上面的方法就能避免Fragment在切换的时候再次调用onCreateView()的问题