fragment -重影问题
fragment -重影问题###
-
造成fragment重影的原因:
- 代码里用add fragment 然后调用hide和show来替换replace方式
- 这样做不用每次切换fragment都重新加载界面和数据
- 但是正因为这样当我们activity异常关闭重启时你原先的所有fragment也都会跟着activity重新绘制出来,然而这个时候所有的hide和show失灵了,
- 因为我们默认是没有找到系统帮我们恢复的fragment,而是自己又重新new了一个fragment出来
- 解决这个问题的核心就是找到系统帮我恢复的fragment并操作相应方法
以上采用add fragment调用hide 和show来替换replace的方式,解决重影问题大都是采用以下方式解决:
- 重写onSaveInstanceState()方法注释掉super.onSaveInstanceState(outState)这句代码,这样activity就不会保存原fragment的实例了
@Override
protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
}
- 由于这边界面显示不需要加载任何的数据,直接采用replace替换布局的方式显示内容
//默认启动时显示的页面
getSupportFragmentManager().beginTransaction().replace(R.id.main_content, InventoryFragment.newInstance("1")).commit();
-
在fragment中的fragment替换布局时不慎采用
getChildFragmentManager()
,导致出现子页面中的重影问题;- 解决办法将
getChildFragmentManager()
更改为getFragmentManager()
解决该问题;
- 解决办法将
@Override
public void onClick(View view) {
int id = view.getId();
switch (id){
case R.id.btn_read:
getFragmentManager().beginTransaction().replace(R.id.write_page_content, ReadFragment.newInstance("read")).commit();
btnRead.setCompoundDrawablesRelativeWithIntrinsicBounds(0,R.drawable.read_red,0,0);
btnWrite.setCompoundDrawablesRelativeWithIntrinsicBounds(0,R.drawable.write_gray,0,0);
btnLock.setCompoundDrawablesRelativeWithIntrinsicBounds(0,R.drawable.lock_gray,0,0);
break;
case R.id.btn_write:
getChildFragmentManager().beginTransaction().replace(R.id.write_page_content, WriteFragment.newInstance("write")).commit();
btnRead.setCompoundDrawablesRelativeWithIntrinsicBounds(0,R.drawable.read_gray,0,0);
btnWrite.setCompoundDrawablesRelativeWithIntrinsicBounds(0,R.drawable.write_red,0,0);
btnLock.setCompoundDrawablesRelativeWithIntrinsicBounds(0,R.drawable.lock_gray,0,0);//zheli有问题吧
break;
case R.id.btn_lock://切换第三个 重叠
getFragmentManager().beginTransaction().replace(R.id.write_page_content, LockFragment.newInstance("lock")).commit();
btnRead.setCompoundDrawablesRelativeWithIntrinsicBounds(0,R.drawable.read_gray,0,0);
btnWrite.setCompoundDrawablesRelativeWithIntrinsicBounds(0,R.drawable.write_gray,0,0);
btnLock.setCompoundDrawablesRelativeWithIntrinsicBounds(0,R.drawable.lock_red,0,0);
break;
}
- 由于前两个界面大都内容相似,只有一个button有所改变,调试时只发现第三个页面有重影问题,很不能理解,仔细查看后,发现每个页面其实都有重影问题,前两个页面切换时重影使得界面的字体等内容加粗了,不仔细查看还真看不出来,以致于以为只是第三个页面的布局存在问题,苦苦排查了好久,最终定位到问题得以解决。