位置: 编程技术 - 正文

【Android】保存Fragment切换状态 FragmentPagerAdapter(android保存文件到本地)

编辑:rootadmin

推荐整理分享【Android】保存Fragment切换状态 FragmentPagerAdapter(android保存文件到本地),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android保存设置,android 保存文件,android怎么保存数据,android 保存文件,android保存设置,android保存设置,android 保存文件,android保存设置,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

一般频繁切换Fragment会导致频繁的释放和创建,如果Fragment比较臃肿体验就非常不好了,这里分享一个方法。

声明

欢迎转载,但请保留文章原始出处:) 博客园:

正文

一、应用场景

1、不使用ViewPager

2、不能用replace来切换Fragment,会导致Fragment释放(调用onDestroyView)

二、实现

1、xml

<LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <FrameLayout android:id="@&#;id/container" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1.0" > </FrameLayout> <RadioGroup android:id="@&#;id/main_radio" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:gravity="bottom" android:layout_marginBottom="-6dp" android:orientation="horizontal" > <RadioButton android:id="@&#;id/radio_button0" style="@style/main_tab_bottom" android:drawableTop="@drawable/bottom_1" /> <RadioButton android:id="@&#;id/radio_button1" style="@style/main_tab_bottom" android:drawableTop="@drawable/bottom_2" /> <RadioButton android:id="@&#;id/radio_button2" style="@style/main_tab_bottom" android:drawableTop="@drawable/bottom_3" /> <RadioButton android:id="@&#;id/radio_button3" style="@style/main_tab_bottom" android:drawableTop="@drawable/bottom_4" /> <RadioButton android:id="@&#;id/radio_button4" style="@style/main_tab_bottom" android:drawableTop="@drawable/bottom_5" /> </RadioGroup></LinearLayout>

代码说明:

非常常见的底部放5个RadioButton,点击切换不同的Fragment。

2、Activity

【Android】保存Fragment切换状态 FragmentPagerAdapter(android保存文件到本地)

为RadioButton设置setOnCheckedChangeListener事件,其他代码:

@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { Fragment fragment = (Fragment) mFragmentPagerAdapter.instantiateItem(mContainer, buttonView.getId()); mFragmentPagerAdapter.setPrimaryItem(mContainer, 0, fragment); mFragmentPagerAdapter.finishUpdate(mContainer); } } private FragmentPagerAdapter mFragmentPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int position) { switch (position) { case R.id.radio_button1: return new Fragment1(); case R.id.radio_button2: return new Fragment2(); case R.id.radio_button3: return new Fragment3(); case R.id.radio_button4: return new Fragment4(); case R.id.radio_button0: default: return new Fragment0(); } } @Override public int getCount() { return 5; } };

代码说明:

instantiateItem从FragmentManager中查找Fragment,找不到就getItem新建一个,setPrimaryItem设置隐藏和显示,最后finishUpdate提交事务。

mContainer就是xml中的FrameLayout。

三、FragmentPagerAdapter核心代码

@Override public Object instantiateItem(ViewGroup container, int position) { if (mCurTransaction == null) { mCurTransaction = mFragmentManager.beginTransaction(); } final long itemId = getItemId(position); // Do we already have this fragment? String name = makeFragmentName(container.getId(), itemId); Fragment fragment = mFragmentManager.findFragmentByTag(name); if (fragment != null) { if (DEBUG) Log.v(TAG, "Attaching item #" &#; itemId &#; ": f=" &#; fragment); mCurTransaction.attach(fragment); } else { fragment = getItem(position); if (DEBUG) Log.v(TAG, "Adding item #" &#; itemId &#; ": f=" &#; fragment); mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), itemId)); } if (fragment != mCurrentPrimaryItem) { fragment.setMenuVisibility(false); fragment.setUserVisibleHint(false); } return fragment; } @Override public void destroyItem(ViewGroup container, int position, Object object) { if (mCurTransaction == null) { mCurTransaction = mFragmentManager.beginTransaction(); } if (DEBUG) Log.v(TAG, "Detaching item #" &#; getItemId(position) &#; ": f=" &#; object &#; " v=" &#; ((Fragment)object).getView()); mCurTransaction.detach((Fragment)object); } @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { Fragment fragment = (Fragment)object; if (fragment != mCurrentPrimaryItem) { if (mCurrentPrimaryItem != null) { mCurrentPrimaryItem.setMenuVisibility(false); mCurrentPrimaryItem.setUserVisibleHint(false); } if (fragment != null) { fragment.setMenuVisibility(true); fragment.setUserVisibleHint(true); } mCurrentPrimaryItem = fragment; } } @Override public void finishUpdate(ViewGroup container) { if (mCurTransaction != null) { mCurTransaction.commitAllowingStateLoss(); mCurTransaction = null; mFragmentManager.executePendingTransactions(); } }

FragmentPagerAdapter是support包自带的类。

四、注意

之前自己模拟ViewPager用attach、setMenuVisibility、setUserVisibleHint来控制Fragment的显示隐藏,经常会出现Fragment重叠现象,非常头疼,换了这个之后目前没有发现重叠现象。

五、文章后期维护

-- 上传示例代码:

@Override public void setMenuVisibility(boolean menuVisible) { super.setMenuVisibility(menuVisible); if (this.getView() != null) this.getView().setVisibility(menuVisible ? View.VISIBLE : View.GONE); }

重新做例子时发现自己也出不来效果了,后来发现少了这段代码。

--想实现本文的效果还是推荐直接使用ViewPager,通过自定义ViewPager禁用掉左右滑动和自动销毁即可,根据评论来看非正常情况下重影现象还是挺严重的。

结束

需要多看看源码,才能很好的解决问题。

Android使用FFmpeg实现定时录像 1、需求分析在Android下实现定时的录像,首先可以在网络摄像机设置页面实现,在某个时刻录像,但是这种情况福想的视频不是保持在摄像机本地就是上

Android运行时候端口被占用 错误提醒:Theconnectiontoadbisdown,andasevereerrorhasoccured.情况一:尝试以下步骤:运行关闭的Eclipse转到在命令提示符在AndroidSDK平台工具目录键入adbkill-server(E

Android四大组件之~~ContentProvider 声明:转载请注明出处:

标签: android保存文件到本地

本文链接地址:https://www.jiuchutong.com/biancheng/379709.html 转载请保留说明!

上一篇:android Intent的常用参数解说(android intent作用)

下一篇:Android使用FFmpeg实现定时录像(Android使用领域是什么)

  • 待处理财产损益年底怎么处理
  • 基本账户可以转移吗
  • 微信支付宝收入计入科目
  • 税务局登录账号是多少
  • 简易征收的老项目是指什么时候
  • 培训学校教具记在什么费用
  • 派发现金红利分录
  • 预付账款是
  • 工资扣保险怎么做凭证
  • 广告位租赁交印花税吗
  • 国税的应交税款在地税的财务报表上怎么填?
  • 勾选认证售票状态可以改吗
  • 往年银行余额和账目不符怎么调整
  • 完工产品定额直接材料费用
  • 经营活动现金流量净额
  • 原材料暂估入库怎么做账
  • 虚拟股权分红怎么做账
  • 英雄联盟符文推荐怎么不弹出来
  • windows版本比较
  • 安装额外语言
  • 研发费中废料收入怎么处理
  • win7电脑怎么样
  • 腾讯电脑管家上的steam可以吗
  • 简单才能极致
  • 塞维利亚是港口吗?
  • PHP:mb_list_encodings()的用法_mbstring函数
  • 在php中,字符串有哪些表示形式
  • mp3最早什么年代流行
  • php 验证码
  • 劳务报酬所得的计税标准
  • laravel启动流程
  • 美国布莱斯大峡谷成因
  • Vue Admin Template关闭eslint校验,lintOnSave:false设置无效解决办法
  • 删除数组中某个值的数
  • xml格式化输出
  • 赠送的物品有价值吗
  • 万能转换器mp4
  • 预计负债的主要账务处理
  • 会计中的一级科目是什么意思
  • SQLITE3 使用总结
  • 帝国cms使用redis
  • 其他收益算营业收入吗
  • 摘要概括增值税专用发票的基本联次
  • 四种股利分配政策及适用情况
  • 发票种类8种分别是
  • 企业所得税研发费用如何加计扣除?
  • 信用减值损失属于什么类
  • 增值税进项发票不够抵扣怎么办
  • 其他应收款和其他应付款可以通用吗
  • 开劳务发票需要的资料有哪些?
  • 企业购买商品房作为职工宿舍
  • 运费发票如何做分录
  • 航天信息的发票以什么形式导入开票信息
  • 长期借款转其他应付款
  • 公司报税金额和实际发的不一致可以去告吗?
  • 售后维修费会计分录
  • 应收账款和应付账款的管理
  • 所税税汇算补交怎么算
  • 农业生产成本核算方法
  • 施工企业人工费控制措施
  • 个体户银行开户所需资料
  • 人力资源公司的进项票有哪些
  • 新增注册资金
  • 双系统怎么设置引导启动项
  • 键盘设施
  • 电脑键盘上f1到f12快捷键的功能分别是
  • 电脑系统管理员已阻止这个应用怎么办
  • win7无权关闭计算机
  • win10一年更新一次
  • win8系统远程桌面在哪里
  • windows8图片
  • win10 win8.1
  • rapidjson使用
  • qt widget opengl
  • easyui框架的优缺点
  • JavaScript中的this
  • javascript基础编程
  • 浅谈自己对教育的理解
  • 群租房怎么举报电话
  • 如何查询企业税收情况
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设