在一个FragmentTransaction中进行多个操作时的注意事项

本文深入探讨了在Android中使用FragmentTransaction进行多个操作时的注意事项,特别是add、hide和show操作的执行顺序及其对Fragment生命周期的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个FragmentTransaction中进行多个操作时要注意一些事情:
比如在一个FragmentTransaction中先后执行以下操作:
1. add一个Fragment
2. hide这个Fragment
3. show这个Fragment

如果我们在fragment的onHiddenChanged中做一些事情的话,我们会发现getActivity是为空的,为什么?请看以下代码:
/Users/lihuaping/Library/Android/sdk/sources/android-22/android/support/v4/app/BackStackRecord.java

Op op = mHead;
        while (op != null) {
            int enterAnim = state != null ? 0 : op.enterAnim;
            int exitAnim = state != null ? 0 : op.exitAnim;
            switch (op.cmd) {
                case OP_ADD: {
                    Fragment f = op.fragment;
                    f.mNextAnim = enterAnim;
                    mManager.addFragment(f, false);
                } break;
                case OP_REPLACE: {
                    xxxxxxxx
                } break;
                case OP_REMOVE: {
                    xxxxxxxx
                } break;
                case OP_HIDE: {
                    Fragment f = op.fragment;
                    f.mNextAnim = exitAnim;
                    mManager.hideFragment(f, transition, transitionStyle);
                } break;
                case OP_SHOW: {
                    Fragment f = op.fragment;
                    f.mNextAnim = enterAnim;
                    mManager.showFragment(f, transition, transitionStyle);
                } break;
                case OP_DETACH: {
                    xxxxxxxx
                } break;
                case OP_ATTACH: {
                    xxxxxxxx
                } break;
                default: {
                    throw new IllegalArgumentException("Unknown cmd: " + op.cmd);
                }
            }

            op = op.next;
        }

        mManager.moveToState(mManager.mCurState, transition, transitionStyle, true);

我们可以看到这个循环是把BackStackRecord中的每一个Op从前往后依次执行的,mManager.addFragment(f, false);的第二个参数为false,表示不要马上执行moveToState,那么什么时候执行moveToState呢?在所有的Op执行了之后,也就是最后一行代码。而在moveToState执行之前,Fragment的生命周期方法是没有被回调的,所以在onHiddenChanged中getActivity就会为空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值