ButterKnife与Fragment的爱恨情仇(java.lang.IllegalStateException: Bindings already cleared.)

业务场景:常规app开发 页面切换框。底下4个选项卡。切换 上面4个不同页面的切换。业务逻辑不再赘述。

我在BaseFragment里面使用了注解框架ButterKnife注册,代码如下:

ButterKnife与Fragment的爱恨情仇(java.lang.IllegalStateException: Bindings already cleared.)_第1张图片

onDestroyView() 里面进行解绑

ButterKnife与Fragment的爱恨情仇(java.lang.IllegalStateException: Bindings already cleared.)_第2张图片

以当前 方式 注册Fragment。

好多朋友肯定遇到了 多切换几次选项卡 出现了 崩溃现象:

  java.lang.IllegalStateException: Bindings already cleared.

解决办法:

方案1:网上有大部分  相关介绍 是 butterknife 注册时机不对。。他们推荐把 注册时机修改为 if语句外面。

修改后代码为:ButterKnife与Fragment的爱恨情仇(java.lang.IllegalStateException: Bindings already cleared.)_第3张图片

大家和 一开始对比一下。。发现 原来是在   if    语句里面,现在给拿出来了。。

这种方式解决了问题。我个人并不推荐这。我们需要找一下原因。为啥出现了这个问题。

方案二:出现这种问题 百分之99是因为 你想 组件 添加Fragment时候 用的 是   replace()方法,这种方法在每次切换添加的时候都会把上一个Fragment销毁掉。你可以打印一下每个Fragment的 onDestroyView()  方法就可以查看了。既然是这个方法的毛病。那么我们就选用另外一个方法 。。add()方法 。。然后 每次切换选项卡的时候 控制 Fragment的显示与隐藏就好了。下面我贴一下主要解决方法的代码。

Listtags=new ArrayList<>();//用来标志每个fragment的tag.避免 出现重复
Listdatalist=new ArrayList<>();//用来记录添加的Fragment
public void setFragmeng() {
    tags.clear();
    datalist.clear();
    tags.add("个人");
    tags.add("活动");
    tags.add("机构");
    tags.add("问答");
    fragmentManager=this.getSupportFragmentManager();
    //第一个Framgnet
    BaseFragment baseFragment1 = (BaseFragment) fragmentManager.findFragmentByTag(tags.get(0));
    if(baseFragment1 == null){
        baseFragment1 =new MyFragment();
        datalist.add(baseFragment1);
    }else{
        datalist.add(baseFragment1);
    }
    //第二个Framgnet
    BaseFragment baseFragment2 = (BaseFragment) fragmentManager.findFragmentByTag(tags.get(1));
    if(baseFragment2 == null){
        baseFragment2 =new MyFragment();
        datalist.add(baseFragment2);
    }else{
        datalist.add(baseFragment2);
    }
    //第三个Framgnet
    BaseFragment baseFragment3 = (BaseFragment) fragmentManager.findFragmentByTag(tags.get(2));
    if(baseFragment3 == null){
        baseFragment3 =new MyFragment();
        datalist.add(baseFragment3);
    }else{
        datalist.add(baseFragment3);
    }
    //第四个Framgnet
    BaseFragment baseFragment4 = (BaseFragment) fragmentManager.findFragmentByTag(tags.get(3));
    if(baseFragment4 == null){
        baseFragment4 =new MyFragment();
        datalist.add(baseFragment4);
    }else{
        datalist.add(baseFragment4);
    }
    FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
    //把上面所有需要的Fragment添加进去
    for(int i=0;i 
  
 //选中的Fragement显示。其它的隐藏
public void setOnFragmentChanged(int index){
         FragmentTransaction ft = fragmentManager.beginTransaction()
             for(int i=0;i 
  

以上几个主要方法添加进去就可以看出效果了。

 

你可能感兴趣的:(ButterKnife与Fragment的爱恨情仇(java.lang.IllegalStateException: Bindings already cleared.))