radiogroup+fragment是很常用的主页导航控件,之前为了代码简便一直使用的replace()替换fragment,代码如下:

getSupportFragmentManager().beginTransaction().replace(R.id.framlayout,fragment).commit();
这种方法使用起来方便,但最大的问题是,每次执行都会把之前的fragment队列中的所有fragment对象全部清除,然后重新加载一个新的fragment进去,
相当于使用remove()+ add();
这会造成每次页面切换的时候都重新加载页面,如果你里面有网络请求等耗时操作,就更浪费资源。
所以研究了一下,使用add() + show() + hide()三个方法结合使用。
使用这三个方法你会发现 当第二次切换时,oncreateview()方法就不再执行。核心代码如下:
  fragment = manager.findFragmentByTag("first");
if (fragment == null) {
fragment = new HomeFragment();
LogUtils.logInfoStar("new了一次");
transaction.add(R.id.framlayout, fragment, "first").commit();
} else if(fragment.isAdded()){
transaction.show(fragment).commit();
LogUtils.logInfoStar("zhixingzzh");
}else{
transaction.add(R.id.framlayout, fragment, "first").commit();
}
if (preFragment != null)
transaction.hide(preFragment); //隐藏上一个fragment
preFragment = fragment;//记录上一个fragment

全部代码如下:

 radiogroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
Fragment fragment = null;
switch (checkedId) {
case R.id.radio_first: fragment = manager.findFragmentByTag("first");
if (fragment == null) {
fragment = new HomeFragment();
LogUtils.logInfoStar("new了一次");
transaction.add(R.id.framlayout, fragment, "first").commit();
} else if(fragment.isAdded()){
transaction.show(fragment).commit();
LogUtils.logInfoStar("zhixingzzh");
}else{
transaction.add(R.id.framlayout, fragment, "first").commit();
} break;
case R.id.radio_second:
fragment=manager.findFragmentByTag("second");
if(fragment==null){
fragment = new CategoryFragment();
transaction.add(R.id.framlayout,fragment,"second").commit();
}else if(fragment.isAdded()){
transaction.show(fragment).commit();
}else{
transaction.add(R.id.framlayout,fragment,"second").commit(); }
break;
case R.id.radio_third:
fragment=manager.findFragmentByTag("third");
if(fragment==null){
fragment = new SearchFragment();
transaction.add(R.id.framlayout,fragment,"third").commit();
}else if(fragment.isAdded()){
transaction.show(fragment).commit();
}else{
transaction.add(R.id.framlayout,fragment,"third").commit();
}
break;
case R.id.radio_fourth: fragment=manager.findFragmentByTag("fourth");
if(fragment==null){
fragment = new ShoppingCartFragment();
transaction.add(R.id.framlayout,fragment,"fourth").commit();
}else if(fragment.isAdded()){
transaction.show(fragment).commit();
}else{
transaction.add(R.id.framlayout,fragment,"fourth").commit();
}
break;
case R.id.radio_fifth:
fragment=manager.findFragmentByTag("fifth");
if(fragment==null){
fragment = new MoreFragment();
transaction.add(R.id.framlayout,fragment,"fifth").commit();
}else if(fragment.isAdded()){
transaction.show(fragment).commit();
}else{
transaction.add(R.id.framlayout,fragment,"fifth").commit();
}
break;
}
if (preFragment != null)
transaction.hide(preFragment);
preFragment = fragment;
}
});
//使用这种方式设置默认选中,监听方法会执行两次,也就是第一的首页fragment会被创建两次。
//radiogroup.check(R.id.radio_first);
//使用这种方式设置默认选中 页面改变监听方法只会执行一次
radioFirst.setChecked(true);

关于默认选择首页的方式导致初始化页面时执行两次监听方法的详细讲解可参考下面博文,简单易懂:

http://blog.csdn.net/piglovesula/article/details/9820521
以上方法自己摸索,一股骚西西的菜鸟味,集成环信SDK时发现了一种很牛逼简便的写法,如下:
/**
* button点击事件
*
* @param view
*/
public void onTabClicked(View view) {
switch (view.getId()) {
case R.id.btn_conversation:
index = 0;
break;
case R.id.btn_address_list:
index = 1;
break;
case R.id.btn_setting:
index = 2;
break;
}
if (currentTabIndex != index) {
FragmentTransaction trx = getSupportFragmentManager().beginTransaction();
trx.hide(fragments[currentTabIndex]);
if (!fragments[index].isAdded()) {
trx.add(R.id.fragment_container, fragments[index]);
}
trx.show(fragments[index]).commit();
}
mTabs[currentTabIndex].setSelected(false);
// 把当前tab设为选中状态
mTabs[index].setSelected(true);
currentTabIndex = index;
}

RadioGroup+Fragment 使用Fragment的add()方法,防止使用replace每次都重新加载页面,造成资源浪费的更多相关文章

  1. 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题

    一.问题分析 对于后台系统,相比大家都有所印象,知道其中的布局结构,如图: 在这种布局中我们需要将header,sidebar,footer分开,而且对于中间部分的content内容需要动态变化,即根 ...

  2. 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间

    [源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...

  3. jquery加载页面的方法

    jquery加载页面的方法(页面加载完成就执行),建议大家看下windows.onload与$(document).ready之间的区别.   1.$(function(){ $("#a&q ...

  4. jquery加载页面的方法(页面加载完成就执行)

    jquery加载页面的方法(页面加载完成就执行),建议大家看下windows.onload与$(document).ready之间的区别. 1.$(function(){  $("#a&qu ...

  5. 关于IE8中使用Jquery load方法无法正常加载页面

    最近发现,在IE8中使用Jquery load方法时无法正常加载页面,页面显示空白,没有加载.调试发现,页面多了一个</div>标签,但在FF和CH下表现正常.希望能给遇到同样问题的码农有 ...

  6. jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法

    博客分类: jquery-easyui jQueryAjax框架HTML  现象: AJAX返回的html无法做到自动渲染为EasyUI的样式.比如:class="easyui-layout ...

  7. 535种使用JavaScript重新加载页面的方法

    除了location = location之外还有534中方法重新加载页面 location = location location = location.href location = window ...

  8. [转]jquery加载页面的方法(页面加载完成就执行)

    jquery加载页面的方法(页面加载完成就执行),建议大家看下windows.onload与$(document).ready之间的区别.   1.$(function(){ $("#a&q ...

  9. [转]在Arcmap中加载互联网地图资源的4种方法

    转自http://blog.3snews.net/space.php?uid=6955280&do=blog&id=67981 前一段时间想在Arcmap中打开互联网地图中的地图数据, ...

随机推荐

  1. 最流行的PHP 代码规范

    “PHP是最好的编程语言” ;-) 那么PHPer习惯使用什么样的代码规范呢?sideeffect.kr通过分析GitHub上托管的开源代码,得出了一些有趣的结果,让我们一起来看看吧. 缩进 空格(7 ...

  2. iOS - (集成支付宝SDK大坑总结)

    其实集成支付宝相对于集成微信支付来说,支付宝算是简单的了,后续有空再去研究微信支付,现目前先总结一下集成支付宝所遇到的坑,其实支付宝的坑也不算太多,细算下来大概5-6个左右,但是其报错方式有点恶心,不 ...

  3. freemark 判断是否为空 是否存在

    <!--1\---><!--判断aaa是否不为空,eclipse插件老报错.---><#if aaa??>  ${aaa}</#if><!--2\ ...

  4. [翻译]java nio 概述

    原文地址:http://tutorials.jenkov.com/java-nio/overview.html java NIO 包含一下核心内容: Channels Buffers Selector ...

  5. TIJ——Chapter Two:Everything Is an Object

    If we spoke a different language, we would perceive a somewhat different world. Ludwig Wittgenstein( ...

  6. UVa 10007 - Count the Trees(卡特兰数+阶乘+大数)

    题目链接:UVa 10007 题意:统计n个节点的二叉树的个数 1个节点形成的二叉树的形状个数为:1 2个节点形成的二叉树的形状个数为:2 3个节点形成的二叉树的形状个数为:5 4个节点形成的二叉树的 ...

  7. 判断java中两个对象是否相等

    java中的基本数据类型判断是否相等,直接使用"=="就行了,相等返回true,否则,返回false. 但是java中的引用类型的对象比较变态,假设有两个引用对象obj1,obj2 ...

  8. 变形--旋转 rotate()

    旋转rotate()函数通过指定的角度参数使元素相对原点进行旋转.它主要在二维空间内进行操作,设置一个角度值,用来指定旋转的幅度.如果这个值为正值,元素相对原点中心顺时针旋转:如果这个值为负值,元素相 ...

  9. MySQL 请选择合适的列! 转载(http://www.cnblogs.com/baochuan/archive/2012/05/23/2513224.html)

    点击图片,可查看大图.    介绍   情况:如果你的表结构设计不良或你的索引设计不佳,那么请你优化你的表结构设计和给予合适的索引,这样你的查询性能就能提高几个数量级.——数据越大,索引的价值越能体现 ...

  10. c语言对文件操作完成后尽量手动关闭

    是这样的,我写了一个函数,传给函数文件名,在函数中对文件写入一些内容.在这个函数的后面没有手动使用 fclose. 当在程序中对这个函数调用两次之后,最终把要写入的文件写错了. 在第二次使用 fope ...