能否替换同标签Fragment?多次替换后findFragmentByTag返回哪个实例?
关于Fragment替换与标签查找的问题解答
首先明确回答:完全可以替换标签名相同的Fragment,replace()方法并不会限制你使用重复的标签,哪怕多次用同一个标签执行替换操作也是合法的。
接下来针对你提到的场景详细解释:
你每次调用这段代码:
getSupportFragmentManager() .replace(R.id.container, MyFragment.newInstance(), "same_fragment_tag") .addToBackStack(null) .commit();
都会发生这几件事:
- 每次调用
MyFragment.newInstance()都会创建一个全新的MyFragment实例(除非你在newInstance里做了单例处理,但默认写法都是返回新实例)。 replace()会把容器R.id.container里当前存在的Fragment移除(因为你加了addToBackStack(null),这个旧Fragment不会被销毁,而是被存入回退栈,处于停止状态),然后把新创建的MyFragment实例添加到容器中,同时给这个新实例打上"same_fragment_tag"的标签。
当你之后调用:
Fragment target = getSupportFragmentManager().findFragmentByTag("same_fragment_tag");
得到的会是最后一次调用replace时添加的那个MyFragment实例——也就是当前正显示在容器里、处于活跃状态的那个实例。
这里要注意一个细节:回退栈里的那些旧Fragment实例,它们的标签依然是"same_fragment_tag"(因为标签是在它们被添加时设置的,不会改变),但findFragmentByTag()在存在多个同标签Fragment时,会返回当前FragmentManager中最新添加且处于活跃状态的那个实例,也就是当前显示在屏幕上的最新版本。
如果你想验证这点,可以给每个MyFragment实例加一个唯一的标识(比如构造时传入一个ID),然后在调用findFragmentByTag后打印这个标识,就能看到确实是最后创建的那个实例。
内容的提问来源于stack exchange,提问作者Pai-Hsiang Huang
相关产品推荐
相关产品推荐

