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

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

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

onDestroyView() 里面进行解绑

以当前 方式 注册Fragment。

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

  java.lang.IllegalStateException: Bindings already cleared.

解决办法:

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

修改后代码为:

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

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

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

List<String>tags=new ArrayList<>();//用来标志每个fragment的tag.避免 出现重复
List<BaseFragment>datalist=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<datalist.size();i++){
        ft.add( R.id.main_tab_content,datalist.get(i),tags.get(i));
    }
    ft.commit();
    setOnFragmentChanged(0);
}
 //选中的Fragement显示。其它的隐藏
public void setOnFragmentChanged(int index){
         FragmentTransaction ft = fragmentManager.beginTransaction()
             for(int i=0;i<datalist.size();i++){
             if(i==index){//选中的Fragement显示。其它的隐藏
                 ft.show(datalist.get(i));
                 datalist.get(i).onResume();
             }else{
                 ft.hide(datalist.get(i));
                 datalist.get(i).onPause();
             }
         }
         ft.commit();
     }

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

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值