Fragment 深度解析

fragment生命周期测试
1、本项目用于测试fragment和Activity生命周期的关系,
2、本项目用于测试fragment在各种情况下的声明周期的调用,具体情况如下:

    观察测试效果:
                fragment声明周期以及回退操作效果(界面切换,界面状态变化,是否保留输入和界面状态)
        测试情况:
            1>a、不加入回退栈的情况下(replace())  观察测试效果
                  b、 不加入回退栈的情况下(add()) 观察测试效果

            2>a、加入回退栈的情况下 (replace()并调用addToBackStack()方法) 观察测试效果
                  b、加入回退栈的情况下 (add()并调用addToBackStack()方法) 观察测试效果

                3>a、我们只隐藏fragment (add()并调用addToBackStack()方法),不进行替换观察测试效果
                  b、我们只隐藏fragment (replace()并调用addToBackStack()方法),进行替换观察测试效果


    测试效果:
        1>a测试效果:
          b测试效果:

        2>a测试效果:
          b测试效果:

        3>a测试效果:
          b测试效果:

总结:1、通过代码测试发现,我们如果只用add()方法,将不会销毁当前的fragment不会调用它的任何生命周期,而且会加载指定的fragment,造成他们两个界面会叠加显示
2、 replace()方法是相当于是:
先remove,会调用当前的fragment的(onPause,onStop,onDestoryView onDestory,onDetach)销毁当前的fragment,
然后在调用add()方法,调用要加载的fragment的(onAttach onCreate onActivityCreated onCreateView onStart onResume)生命周期
并将此fragment的view绘制到屏幕上。
3、调用hid方法将当前的frament的view隐藏,但是不会调当前fragment的任何生命周期方法,在调用add方法则会将指定的fragment绘制到屏幕上,若果
不调用hid方法直接调用add 会造成两个界面叠加显示。

fragment回退栈说明

1、引入代码:

getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container,
                        productFragment, "mTag").addToBackStack("product")//将当前替换的fragment加入到回退栈中,而不是把被替换的fragment加入到回退栈中
                .commit();

我们比较关心的是:mTag和product两个参数的作用

mTag
功能:标记productFragment,谷歌的官方解释

@param tag Optional tag name for the fragment, to later retrieve the fragment with {@link FragmentManager#findFragmentByTag(String)

也就是说,我们可以使用FragmentManager#findFragmentByTag(String)来找到productFragment

product
功能:标记productFragment在回退栈中的位置。

fragment回退栈操作的方法介绍:
addToBackStack(tag); 将Fragment添加到回退栈中
popBackStack(); 清除回退栈中栈顶的Fragment
popBackStack(String tag, int i ); 
如果i=0,回退到该tag所对应的Fragment层
如果i=FragmentManager.POP_BACK_STACK_INCLUSIVE,回退到该tag所对应的Fragment的上一层
popBackStackImmediate 立即清除回退栈中栈顶Fragment
getBackStackEntryCount(); 获取回退栈中Fragment的个数
getBackStackEntryAt(int index) 获取回退栈中该索引值下的Fragment

我们可以使用popBackStack(String tag, int i )方法操作addToBackStack(tag)中设置的tag,直接定位到product的productFragment,并把productFragment之上的frament弹出;

测试代码:
 ProductFragment productFragment = ProductFragment.forProduct(product.getId());

        //这样做fragment操作,只是开启了productFragment,但是并未把上一fragment替换,点击返回的时候,还会保留上一个fragment的状态
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container,
                        productFragment, null).addToBackStack("product")//将当前替换的fragment加入到回退栈中,而不是把被替换的fragment加入到回退栈中
                .commit();
        getSupportFragmentManager().popBackStackImmediate("product", FragmentManager.POP_BACK_STACK_INCLUSIVE);

我们将productFragment放入到回退栈中,并标记为product,紧接着我们就,弹出被标记为product的的frament的所在的位置的之上的frament,并包括productFragment

效果:并未进入到productFragment中,而是又回到了productFragment在栈中下一个fragment中。

总结:
1、首先明确:一个Activity只有一个fragment回退栈,我们可以对栈进行操作
2、要弄清楚 add()、replace()、hide()的区别
3、fragment生命周期的管理
那么基本上就搞懂fragment了

猜你喜欢

转载自blog.csdn.net/liujian8654562/article/details/80348358