一个简单无脑的防止内存重启后导致Fragment重叠的解决办法
2017-08-20 16:27
471 查看
一个简单无脑的防止内存重启后导致Fragment重叠的解决办法
谈起Fragment,对于开发Android的各位童鞋来说应该是家常便饭了吧。但是不得不说,Fragment的使用要比Activity的使用要复杂一些,使用Fragment摆在我们面前的坑也是很隐蔽,说不定啥时候就一脚踩了上去,还一脸懵逼。哈哈哈哈废话不多说了。 进入正题,相比用replace,hide和show相信大家用得更多吧,那么大家应该或多或少都解决过Fragment重叠的问题,这里来解决一下因为内存重启导致Fragment重叠的问题(如果你是由于逻辑问题导致重叠,那这篇文章就没什么帮助了) 在这里的问题情景如下:如果Activity由于内存吃紧被回收掉了,而重启这个Activity时,由于FragmentMananger重新恢复栈里的Fragment的时候,默认时show的。真因为如此,所以导致了内存重启时Fragment的重叠。另外小提示:建议大家用v4包的Fragment,而不是sdk自带的,为什么呢?向下兼容好很多。当然你本来就是针对5.0或者6.0以上的Android版本开发的就另当别论了。 好吧现在就上干货: 灰常好用的一个BaseFragment
public class BaseFragment extends Fragment { private static String STATE_SAVE_IS_HIDDEN = "STATE_SAVE_IS_HIDDEN"; private static String TAG = BaseFragment.class.getSimpleName(); @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { boolean isSupporHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN); judgeState(isSupporHidden); } } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { LogUtil.i(TAG, "BaseFragment create" + this.getId()); return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onDestroy() { LogUtil.i(TAG, "BaseFragment destroy" + this.getId()); super.onDestroy(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); LogUtil.i(TAG, "BaseFragment onSaveInstanceState()---内存重启,保存fragment显示状态"); outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden());//fragment内存异常回收时,保存其显示状态 } /** * 判断fragment被意外回收后。也就是内存重启后,是否需要重新显示 * * @param isSupporHidden true-内存重启前改Fragment是hide状态,反之是显示状态 */ private void judgeState(boolean isSupporHidden) { FragmentTransaction mFragmentTransaction = getFragmentManager().beginTransaction(); if (isSupporHidden) { mFragmentTransaction.hide(this); } else { mFragmentTransaction.show(this); } mFragmentTransaction.commit(); } }
其次就是要在Activity的onCreate方法中添加判断是:
// 这里一定要在save为null时才加载Fragment // 因为在页面重启时,Fragment会被保存恢复,而此时再加载Fragment会重复加载,导致重叠 if (savedInstanceState == null) { //走正规流程该做的事 }
相关文章推荐
- mysql导入数据时一个insert过大导致Mysql server has gone way,解决办法
- maven项目由于多个依赖中含有同一个jar包导致的冲突问题的解决办法
- 在ScrollView添加一个ListView造成的滚动问题的简单解决办法()
- 使用SDWebImage和YYImage下载高分辨率图,导致内存暴增的解决办法
- 使用SDWebImage和YYImage下载高分辨率图,导致内存暴增的解决办法
- 更改window账户的用户文件夹导致excel打开csv提示内存不足、word提示环境变量出错解决办法
- 使用SDWebImage和YYImage下载高分辨率图,导致内存暴增的解决办法
- 解决了一个隐蔽的内存泄漏——pthread_create后没有detach导致内存持续增长
- ARC 下处理内存暴涨的一个解决办法
- 用一个最简单方法解决asp.net页面刷新导致数据的重复提交
- 虚拟机内存调的过大导致无法恢复也无法关闭解决办法
- Activity被回收导致fragment的getActivity为null的解决办法
- 解决UIScrollView截获touch事件的一个极其简单有效的办法
- Android fragment 重叠问题——通过hide,show方式导致的解决方法(未解决)
- 内存故障导致死机现象及解决办法
- TSVNCache狂占内存导致诸多问题的解决办法
- jpa缓存导致无法查询到更新后的数据&android出现ANR的一个解决办法
- 在ScrollView添加一个ListView造成的滚动问题的简单解决办法
- 一个极其简单的防止SQL注入的办法(只针对部分有效)转自csdn论坛
- 关于DLL工程中存在全局变量可能导致MFC内存泄露误报的原因分析及解决办法