zoukankan      html  css  js  c++  java
  • Fragment.replace会销毁实例

    项目中如下:

    <FrameLayout
    	android:id="@+id/bottombar"
    	android:layout_width="match_parent"
    	android:layout_height="wrap_content">
    <LinearLayout android:id="@+id/bar1"></LinearLayout>
         <LinearLayout android:id="@+id/bar2" android:visibility="gone"></LinearLayout> </FrameLayout>

    在同一个位置需要显示和隐藏视图相近的两个下bar,由于bar1和bar2内容都非常多,因此会导致这个xml文件非常拥挤。为了使代码简洁,尝试使用两个Fragment在此处进行替换处理,而且好处之一是Fragment在替换的时候有现成的setCustomAnimations()函数实现动画效果。

    private void switchBottomFragment(Fragment in, Fragment out){
    	FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    	fragmentTransaction.setCustomAnimations(R.animator.bottom_category_anim_up, R.animator.bottom_category_anim_down);
    	fragmentTransaction.replace(R.id.bottom_category, in);
    	fragmentTransaction.commit();
    	out = null;	
    }
    

     Fragment in:要显示的bar

       Fragment out:要隐藏的bar

    从表面上来看,效果实现的很好,没有什么问题,但出现了一个问题bar1中有一个RadioGroup,bar1退出的时候我希望clearCheck不选中之前的选中项。因为知道replace会销毁View以及Fragment实例,所以直接在onCreateView中使用了ViewGroup.clearCheck(),然而clearCheck并没有发挥作用。仔细想想,原因如下,而且这里很容易产生难以发现的问题。

    replace()调用的时候,该位置被替换的Fragment实例和视图都会被销毁,但是并不会立即被回收,所以如果在Activity中设置了该Fragment的变量,则该变量对应的实例对象还是旧的,但是整个显示的视图对象却已经是新的了。因此会被替换的Fragment对象一定不能作为变量存在,如果需要用到对象实例,可以使用findFragmentByTag获取实时对象,并且如果需要保存原先的实例,则还需要在onSaveInstanceState中保存需要保存的状态值。

  • 相关阅读:
    go第二天
    go第一天
    engish
    english
    git 生成公钥
    tp5 验证码
    css处理文本折行截断
    数组对象总结(牢记)
    全局css样式
    Flexbox 弹性盒子布局
  • 原文地址:https://www.cnblogs.com/fordreamxin/p/5594598.html
Copyright © 2011-2022 走看看