Android中Fragment添加容易遇到的问题

来源:互联网 发布:证书服务器开放的端口 编辑:程序博客网 时间:2024/06/07 08:09

一.遇到的问题:Fragment和tab不协调工作

在这里就不到Fragment进行介绍了,网上到处都是,现在就说一下我遇到的一个问题,在开发中有时会需要对Fragment进行添加,但是很多时候我们不希望一开始就添加我们手里所有的Fragment,所以我们开始的时候会用transaction.add,或者transaction.replace对Fragment进行添加,对已经添加的Fragment我们通常使用transaction.hide和transaction.show方法进行隐藏和展示,当然也可以在Fragment中用对布局是否为空来判断是否在onCreateView中进行重新绘制。这样可以避免我们重复的加载Fragment中的资源,特别是当你的Fragment中有许多的网络请求或者是耗时操作,而你并不需要在每次切换到这个Fragment中都去调用这些方法去初始化,那么你就应该考虑避免去重复添加Fragment。

刚才讲的都是真正问题的引子,因为当你在添加Fragment时候,通常你会有底部的tab来和你的Fragment进行呼应,你的tab可能是自定义的,也可能是FragmentTabHost也可能是RadioButton。但是当你的应用程序因为内存过大,而且长时间处于后台等原因,内存被系统回收的时候,当你再次将你的应用从后台调回来的时候你就会发现你的Fragment很有可能和你的tab协调不起来了,可能你点击第一个tab可是界面展示的永远是第二个tab的Fragment,界面并没有因为你底部tab的改变而改变。这是因为你的内存被回收后,你的Fragment在栈中也被回收了,当前的activity不再持有Fragment的状态。这个时候你需要在onCreate方法中对Fragment的状态进行一下保存:

 @Override    protected void onCreate(Bundle savedInstanceState) {        if(savedInstanceState == null){            fragment1 = new Fragment1();            fragment2 = new Fragment2();        }else{        /**为空的时候我们重新创建Fragment对象,也就是我们第一次启动应用的时候,当不为空的时候,我们创建过,但是因为被系统回收等原因,我们只能从我们保存的状态中找回,这样可以保证我们的程序回复到以前*/            fragment1 = getSupportFragmentManager().findFragmentByTag("first");                        fragment2 = getSupportFragmentManager().findFragmentByTag("second");        }    }

这样我们就可以使我们的程序在被系统回收内存之后回来仍然能够让Fragment和tab正常工作,很多时候你不做这种处理也不会出问题,但是当你经过大量的测试的时候,当使用场景增加的时候你就会发现这些问题,特别是你的程序存在内存泄漏的时候,所以我建议这个地方还是要加上这种处理为好。

1 0
原创粉丝点击