全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android中Fragment相互切换间不被回收的实现方法

前言

Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的。难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊。Fragment的出现就是为了解决这样的问题。

如今市面上的应用基本上都是单Activity+多Fragment实现的了,而这类APP都有在相互切换时不被回收,即切换回原来的Fragment时还是原先的状态,这就是这里要实现的了。

这里使用Fragment的add()show()hide()实现,即显示和隐藏,这样原来的Fragment就不会被销毁了。

二话不说,贴代码,代码是最好的老师。

示例代码(注释还算详细了)

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

 private ImageView ibOne;
 private ImageView ibTwo;
 private ImageView ibThree;
 
 private FragmentManager mFm;
 private ArrayList<Fragment> mFragmentList = new ArrayList<Fragment>();
 private String[] mFragmentTagList = {"OneFragment", "TwoFragment", "ThreeFragment"};
 private Fragment mCurrentFragmen = null; // 记录当前显示的Fragment

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  initView();
  initData();
  
 }

 private void initData() {
  OneFragment oneFragment = new OneFragment();
  TwoFragment twoFragment = new TwoFragment();
  ThreeFragment threeFragment = new ThreeFragment();
  mFragmentList.add(0, oneFragment);
  mFragmentList.add(1, twoFragment);
  mFragmentList.add(2, threeFragment);

  mCurrentFragmen = mFragmentList.get(0);

  // 初始化首次进入时的Fragment
  mFm = getFragmentManager();
  FragmentTransaction transaction = mFm.beginTransaction();
  transaction.add(R.id.fl_show, mCurrentFragmen, mFragmentTagList[0]);
  transaction.commitAllowingStateLoss();
 }

 // findViewById
 private void initView() {
  ibOne = (ImageView)findViewById(R.id.ib_one);
  ibTwo = (ImageView)findViewById(R.id.ib_two);
  ibThree = (ImageView)findViewById(R.id.ib_three);

  ibOne.setOnClickListener(this);
  ibTwo.setOnClickListener(this);
  ibThree.setOnClickListener(this);
 }

 @Override
 public void onClick(View view) {
  switch (view.getId()){
   case R.id.ib_one:
    switchFragment(mFragmentList.get(0), mFragmentTagList[0]);
    break;
   case R.id.ib_two:
    switchFragment(mFragmentList.get(1), mFragmentTagList[1]);
    break;
   case R.id.ib_three:
    switchFragment(mFragmentList.get(2), mFragmentTagList[2]);
    break;
  }
 }

 // 转换Fragment
 void switchFragment(Fragment to, String tag){
  if(mCurrentFragmen != to){
   FragmentTransaction transaction = mFm.beginTransaction();
   if(!to.isAdded()){
    // 没有添加过:
    // 隐藏当前的,添加新的,显示新的
    transaction.hide(mCurrentFragmen).add(R.id.fl_show, to, tag).show(to);
   }else{
    // 隐藏当前的,显示新的
    transaction.hide(mCurrentFragmen).show(to);
   }
   mCurrentFragmen = to;
   transaction.commitAllowingStateLoss();

  }
 }

 // 当activity非正常销毁时被调用
 @Override
 public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
  super.onSaveInstanceState(outState, outPersistentState);
  // 重置Fragment,防止当内存不足时导致Fragment重叠
  updateFragment(outState);
 }

 // 重置Fragment
 private void updateFragment(Bundle outState) {

  mFm = getFragmentManager();
  if(outState == null){
   FragmentTransaction transaction = mFm.beginTransaction();
   OneFragment oneFragment = new OneFragment();
   mCurrentFragmen = oneFragment;
   transaction.add(R.id.fl_show, oneFragment, mFragmentTagList[0]).commitAllowingStateLoss();
  }else{
   // 通过tag找到fragment并重置
   OneFragment oneFragment = (OneFragment) mFm.findFragmentByTag(mFragmentTagList[0]);
   TwoFragment twoFragment = (TwoFragment) mFm.findFragmentByTag(mFragmentTagList[1]);
   ThreeFragment threeFragment = (ThreeFragment) mFm.findFragmentByTag(mFragmentTagList[2]);
   mFm.beginTransaction().show(oneFragment).hide(twoFragment).hide(threeFragment);
  }
 }
}

我以前对于这种需求是在一个Activity中使用RelativeLayout,在其中加入多个布局(类似Fragment),当点击下方Tab时设置布局的visibility的,思想是一样的,但这样实现起来很是丑陋,所以不建议使用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持


# android  # fragment切换  # fragment  # 相互切换  # Android基础之使用Fragment控制切换多个页面  # Android App中使用ViewPager+Fragment实现滑动切换效果  # Android使用Fragment打造万能页面切换框架  # Android Fragment中使用SurfaceView切换时闪一下黑屏的解决办法  # 一个Activity中多个Fragment的切换  # Android fragment实现多个页面切换效果  # Android中使用TabHost 与 Fragment 制作页面切换效果  # Android使用TabLayou+fragment+viewpager实现滑动切换页面效果  # Android开发使用Activity嵌套多个Fragment实现横竖屏切换功能的方法  # fragment实现隐藏及界面切换效果  # 都是  # 神马  # 是在  # 都有  # 首次  # 多个  # 这就是  # 这类  # 还算  # 这篇文章  # 不被  # 谢谢大家  # 非正常  # 各种各样  # 情况下  # 内存不足  # 我以前  # 是最好的  # 是一样的  # 屏幕尺寸 


相关文章: 如何快速生成可下载的建站源码工具?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  c# 在ASP.NET Core中管理和取消后台任务  安徽网站建设与外贸建站服务专业定制方案  建站主机是什么?如何选择适合的建站主机?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  如何在宝塔面板创建新站点?  *服务器网站为何频现安全漏洞?  网站制作软件有哪些,制图软件有哪些?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  ,柠檬视频怎样兑换vip?  如何在云服务器上快速搭建个人网站?  ,购物网站怎么盈利呢?  如何在Golang中指定模块版本_使用go.mod控制版本号  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在景安服务器上快速搭建个人网站?  网站制作话术技巧,网站推广做的好怎么话术?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  南宁网站建设制作定制,南宁网站建设可以定制吗?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  建站主机CVM配置优化、SEO策略与性能提升指南  如何在Golang中使用replace替换模块_指定本地或远程路径  如何用西部建站助手快速创建专业网站?  如何访问已购建站主机并解决登录问题?  如何在阿里云购买域名并搭建网站?  家具网站制作软件,家具厂怎么跑业务?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  婚礼视频制作网站,学习*后期制作的网站有哪些?  建站之星后台管理如何实现高效配置?  如何在万网自助建站平台快速创建网站?  如何实现建站之星域名转发设置?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  如何快速完成中国万网建站详细流程?  如何高效完成独享虚拟主机建站?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  ,网站推广常用方法?  制作网站的模板软件,网站怎么建设?  Thinkphp 中 distinct 的用法解析  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  PHP正则匹配日期和时间(时间戳转换)的实例代码  建站之星代理如何获取技术支持?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  香港服务器租用费用高吗?如何避免常见误区?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  建站之星安装失败:服务器环境不兼容?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  北京营销型网站制作公司,可以用python做一个营销推广网站吗? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。