前言

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小时内与您取得联系。