多个Fragment在屏幕翻转会重影问题的解决
fragment使用add和hide而不用replace的方法添加到activity中,如果屏幕翻转可能会又add新的fragment进去,所以会重影。
如果有一个sparsearray保存fragment,那么在初始化的时候就应该用
private void initFragment(Bundle savedInstanceState) { //set up fragments // fragments.append(MAIN_INDEX, MainFragment.newInstance()); // fragments.append(SUCCESS_INDEX, SuccessFragment.newInstance()); // fragments.append(FAILED_INDEX, FailedFragment.newInstance()); // fragments.append(NONE_INDEX, NoneFragment.newInstance()); fragments = new SparseArray<>(); //Main Fragment Fragment mainFragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(MAIN_INDEX)); if (mainFragment == null) { mainFragment = MainFragment.newInstance(); } fragments.append(MAIN_INDEX, mainFragment); //Success Fragment Fragment succcessFragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(SUCCESS_INDEX)); if (succcessFragment == null) { succcessFragment = SuccessFragment.newInstance(); } fragments.append(SUCCESS_INDEX, succcessFragment); //Failed Fragment Fragment failedFragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(FAILED_INDEX)); if (failedFragment == null) { failedFragment = FailedFragment.newInstance(); } fragments.append(FAILED_INDEX, failedFragment); //none Fragment Fragment noneFragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(NONE_INDEX)); if (noneFragment == null) { noneFragment = NoneFragment.newInstance(); } fragments.append(NONE_INDEX, noneFragment); //add to activity for (int i = 0; i < fragments.size(); i++) { Fragment f = fragments.valueAt(i); if (!f.isAdded()) getSupportFragmentManager() .beginTransaction() .add(R.id.container, f, String.valueOf(fragments.keyAt(i))) .hide(f) .commit(); } }
不直接append新的fragment,而是通过fragmentsupportmanager先检查有没有已有的fragment,这样就可以解决重影问题。
需要注意的是:setRetainInstance(true)必须设置,这样fragment才不会在manager中销毁,替换fragment后想修改数据才不会出现nullpointerexception错误
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?