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;
}

最新文章

  1. sublime的插件安装
  2. C#输出文字对齐,空格位数对齐
  3. JS高级群的日常!写一个从10到0的倒计时,用console.log打印,不可以用 setInterval!本来说好的研究avalonJS最后演变成了看着大神在那边互相比拼实力。。
  4. Web前端面试笔试题总结
  5. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q45-Q48)
  6. [ZZ] D3D中的模板缓存(3)
  7. Map的数据结构
  8. 开发语言大PK:php和Java哪个更好?
  9. RSA加密解密及数字签名Java实现--转
  10. 《第一行代码》学习笔记3-活动Activity(1)
  11. C#时间格式之GMT时间的格式
  12. 关于windows系统影子账户的问题
  13. JDNI
  14. The type java.util.Map$Entry cannot be resolved. It is indirectly referenced from required .class files
  15. hibernate的session详解
  16. ASP.NET Core使用Jaeger实现分布式追踪
  17. centos7设置静态IP地址
  18. 使用Node.JS监听文件夹变化
  19. 专访探探DBA张文升:PG在互联网应用中同样也跑的很欢畅
  20. beego学习笔记(4):开发文档阅读(4)

热门文章

  1. canvas 基础知识整理(二)
  2. c# yyyyMMdd,dd/MM/yyyy 类型字符串转换为datetime 类型
  3. 一款不错的多选下拉列表利器—— Ext.ux.form.SuperBoxSelect
  4. Linux14.04安装JDK
  5. iOS6:在你的企业系统中支持Passbook
  6. leetcode-5 最长回文子串(动态规划)
  7. 学习jsp(3)
  8. 面向对象 理解 C#复习
  9. 转:python webdriver API 之下拉框处理
  10. How to export a template in Visual Studio?