对于viewpager的调用时,状态保存问题

来源:互联网 发布:ubuntu创建文件夹 编辑:程序博客网 时间:2024/06/05 09:25

问题分析:
    当一个viewpager中包含多个view时,在我们不断的滑动过程中,有可能会出现view的状态丢失情况:view2中包含edittext的输入框。假设我们在里面输入111,然后不断的切换view,
    当再次滑动到view2时,edittext中的内容不存在了(因为如果没有fragmentMenager的保存,在走ondertery()方法的时候就会将其销毁掉《内容不存在了,但view仍然存
在》)。

 原因分析:


viewpager底层通过fragmentMenager进行管理,默认状态可以对view的状态进行保存(表面通过添加fragmentLayout进行填充),但当view的数量增多时,就无法保证。
因此会出现view状态丢失情况。
解决方案:
    1、在editText中的属性中添加id,这样通知ragmentMenager该view状态需要保存。
2、重写BaseFragment ,
 判断当前的view是否为空,如果为空则肯定没有与父控件关联(产生关系)那么就new
 如果不为空,则获取其(view.getParent();)parent,也就是与其关联的viewpager.如果viewpager不为空,则先
  断绝其连接关系,这样view就是独立的个体,不会走ondestery()方法将其状态销毁。当再次滑动到该view时,又重新建立连接。
 
  

public abstract class BaseFragment extends Fragment {

private View view = null;

// 一个View只能被 添加布局里面ViewPager一次

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

if (view == null) {

view = createView(inflater, container, savedInstanceState);

else {

// has parent

ViewGroup parent = (ViewGroup) view.getParent();

if (parent != null) {

parent.removeView(view);

}

}

return view;

 

}

 

protected abstract View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);

}


对于viewpager中存放fragment情况。

总结:对于viewpager的adapter设置的时候。当进入adapter时。会进入父类的fragmentzhon

0 0
原创粉丝点击