业务场景:常规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(); }
以上几个主要方法添加进去就可以看出效果了。