全网整合营销服务商

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

免费咨询热线: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实现隐藏及界面切换效果  # 都是  # 神马  # 是在  # 都有  # 首次  # 多个  # 这就是  # 这类  # 还算  # 这篇文章  # 不被  # 谢谢大家  # 非正常  # 各种各样  # 情况下  # 内存不足  # 我以前  # 是最好的  # 是一样的  # 屏幕尺寸 


相关文章: 浅析上传头像示例及其注意事项  建站VPS推荐:2025年高性能服务器配置指南  香港服务器网站卡顿?如何解决网络延迟与负载问题?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  教程网站设计制作软件,怎么创建自己的一个网站?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  制作电商网页,电商供应链怎么做?  音乐网站服务器如何优化API响应速度?  c++怎么用jemalloc c++替换默认内存分配器【性能】  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何在云指建站中生成FTP站点?  如何自定义建站之星网站的导航菜单样式?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  官网网站制作腾讯审核要多久,联想路由器newifi官网  ui设计制作网站有哪些,手机UI设计网址吗?  网站制作服务平台,有什么网站可以发布本地服务信息?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  制作网站的模板软件,网站怎么建设?  如何正确选择百度移动适配建站域名?  建站上市公司网站建设方案与SEO优化服务定制指南  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  C#如何序列化对象为XML XmlSerializer用法  Swift中switch语句区间和元组模式匹配  青浦网站制作公司有哪些,苹果官网发货地是哪里?  如何在景安服务器上快速搭建个人网站?  文字头像制作网站推荐软件,醒图能自动配文字吗?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  完全自定义免费建站平台:主题模板在线生成一站式服务  如何在宝塔面板中创建新站点?  如何选购建站域名与空间?自助平台全解析  孙琪峥织梦建站教程如何优化数据库安全?  制作表格网站有哪些,线上表格怎么弄?  如何零成本快速生成个人自助网站?  海南网站制作公司有哪些,海口网是哪家的?  存储型VPS适合搭建中小型网站吗?  宝塔建站无法访问?如何排查配置与端口问题?  已有域名如何快速搭建专属网站?  如何生成腾讯云建站专用兑换码?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  网站网页制作专业公司,怎样制作自己的网页?  如何配置WinSCP新建站点的密钥验证步骤?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  建站主机是什么?如何选择适合的建站主机?  建站之星安装失败:服务器环境不兼容?  网站制作话术技巧,网站推广做的好怎么话术? 

您的项目需求

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