前言:本文将结合开发中的实际需求,来讲解一下Fragment中的回退栈 对于Activity,当按返回键时,能够返回到上一个Activity,但是,当我们Fragment到Activity中时,如果不做任何处理,当按返回键时,当前Fragment都会全部退出,如果想要拥有Activity逐渐退出的效果,我们需要应用一下Fragment中的回退栈

案例描述
大家可以自行打开京东,你会发现,如果你点击了分类,发现,购物车,我的,按钮,再按返回键的话,会先回到首页,然后再退出应用.这里应用的就是Fragment的回退栈功能.,下面我将带领大家了解一下回退栈的实现逻辑方法介绍
addToBackStack(tag); 将Fragment添加到回退栈中
popBackStack(); 清除回退栈中栈顶的Fragment
popBackStack(String tag, int i );
如果i=0,回退到该tag所对应的Fragment层
如果i=FragmentManager.POP_BACK_STACK_INCLUSIVE,回退到该tag所对应的Fragment的上一层
popBackStackImmediate 立即清除回退栈中栈顶Fragment
getBackStackEntryCount(); 获取回退栈中Fragment的个数
getBackStackEntryAt(int index) 获取回退栈中该索引值下的Fragment
逐层退出回退栈效果代码实现
布局代码,在布局中,写了一个FrameLayout,用来放置Fragment的容器;写了一个RadioGroup,用来放置下边的几个指示按钮

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><FrameLayoutandroid:id="@+id/framelayout"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content" ><RadioGroupandroid:id="@+id/radioGroup"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#ff0000"android:orientation="horizontal" ><RadioButtonandroid:id="@+id/rb_home"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_weight="1"android:button="@drawable/home_selector"android:checked="true"android:gravity="center_horizontal" /><RadioButtonandroid:id="@+id/rb_cart"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:button="@drawable/cart_selector" /><RadioButtonandroid:id="@+id/rb_category"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:button="@drawable/category_selector" /><RadioButtonandroid:id="@+id/rb_personal"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:button="@drawable/personal_selector" /></RadioGroup></LinearLayout></LinearLayout>

MainActivity中的代码
初始化,在onCreate方法中
初始化控件,并设置监听
添加一个HomeFragment

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();// 获取Fragment管理者fragmentManager = getSupportFragmentManager();// 先默认添加fragment1addFragment(new Fragment1(), "fragment1");}

初始化控件给RadioButton设置监听

private void initView() {radioGroup = (RadioGroup) findViewById(R.id.radioGroup);rb_cart = (RadioButton) findViewById(R.id.rb_cart);rb_category = (RadioButton) findViewById(R.id.rb_category);rb_home = (RadioButton) findViewById(R.id.rb_home);rb_personal = (RadioButton) findViewById(R.id.rb_personal);// 对每一个RadioButton都设置点击事件,注意,在这里并没有对radioGroup设置checkChangeListenerrb_cart.setOnClickListener(this);rb_category.setOnClickListener(this);rb_home.setOnClickListener(this);rb_personal.setOnClickListener(this);}

*点击按钮时,替换Fragment

/*** 根据点击的按钮---依次替换Fragment*/@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.rb_home:addFragment(new Fragment1(), "fragment1");break;case R.id.rb_cart:addFragment(new Fragment2(), "fragment2");break;case R.id.rb_category:addFragment(new Fragment3(), "fragment3");break;case R.id.rb_personal:addFragment(new Fragment4(), "fragment4");break;default:break;}}

添加Fragment的时候,同时将Fragment放到回退栈中
12
监听Activity中的返回键,判断当前回退栈中的Fragment个数,如果回退栈中有大于一个,就一个个清除Fragment,如果只剩一个,说明只剩首页Fragment所对应的Fragment,就finish();

    @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// 判断当前按键是返回键if (keyCode == KeyEvent.KEYCODE_BACK) {// 获取当前回退栈中的Fragment个数int backStackEntryCount = fragmentManager.getBackStackEntryCount();// 判断当前回退栈中的fragment个数,if (backStackEntryCount > 1) {// 立即回退一步fragmentManager.popBackStackImmediate();// 获取当前退到了哪一个Fragment上,重新获取当前的Fragment回退栈中的个数BackStackEntry backStack = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1);// 获取当前栈顶的Fragment的标记值String tag = backStack.getName();// 判断当前是哪一个标记if ("fragment1".equals(tag)) {// 设置首页选中rb_home.setChecked(true);} else if ("fragment2".equals(tag)) {// 设置购物车的tagrb_cart.setChecked(true);} else if ("fragment3".equals(tag)) {rb_category.setChecked(true);} else if ("fragment4".equals(tag)) {rb_personal.setChecked(true);}} else {//回退栈中只剩一个时,退出应用finish();}}return true;}}

退出所有只剩首页而Fragment的代码
其他代码和上边一致,只需要修改一下退出的逻辑.需要判断当前回退栈中有多少个Fragment,使用While循环逐个退出.

    @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// 判断当前按键是返回键if (keyCode == KeyEvent.KEYCODE_BACK) {// 获取当前回退栈中的Fragment个数int backStackEntryCount = fragmentManager.getBackStackEntryCount();// 回退栈中至少有多个fragment,栈底部是首页if (backStackEntryCount > 1) {// 如果回退栈中Fragment个数大于一.一直退出while (fragmentManager.getBackStackEntryCount() > 1) {fragmentManager.popBackStackImmediate();//选中第一个界面rb_home.setChecked(true);}} else {finish();}}return true;}
}

Android之Fragment回退栈详解相关推荐

  1. Android清空Fragment回退栈

    啊= =:国内的资料为什么都是抄来抄去的. 最后上了Stack Overflow才找到了正解. FragmentManager fragmentManager = getFragmentManager ...

  2. android 清空回退栈,清空Fragment回退栈中某个Fragment

    出栈的方法: getActivity().getSupportFragmentManager().popBackStackImmediate(CreateOneFragment.class.getNa ...

  3. Android fragment回退栈

    前言 Activity切换时,是通过栈的形式,不断压栈出栈.对于fragment如果你不手动开启回退栈,它是直接销毁再重建,但如果将fragment任务添加到回退栈,情况就会不一样了,它就有了类似Ac ...

  4. Fragment生命周期详解

    关于Fragment的生命周期,博主写过Activity与Fragment生命周期详解,基本上把Fragment的生命周期详细介绍过,但是那仅仅是创建一个Fragmnet时的生命周期,而事实上Frag ...

  5. Android Telephony分析(三) ---- RILJ详解

    前言 本文主要讲解RILJ工作原理,以便更好地分析代码,分析业务的流程.  这里说的RILJ指的是RIL.java (frameworks\opt\telephony\src\java\com\And ...

  6. Android Loader 异步加载详解一:基础概念

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70241844 本文出自[赵彦军的博客] Android Loader 异步加载详解 ...

  7. Android App优化之ANR详解

    引言 背景:Android App优化, 要怎么做? Android App优化之性能分析工具 Android App优化之提升你的App启动速度之理论基础 Android App优化之提升你的App ...

  8. android demo示例代码,Android Service demo例子使用详解(示例代码)

    Android Service demo例子使用详解\ 概述 Service 是 Android 的四大组件之一,它主要的作用是后台执行操作,Activity 属于带有 UI 界面跟用户进行交互,而 ...

  9. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

最新文章

  1. 德国再出颠覆性发明,这次要安排我们的快递
  2. idea mybatis generator插件_在idea中使用mybatis generator逆向工程生成代码
  3. java 解析注解_Java知识点总结(注解-解析注解)
  4. iPhone 11全球热销:价格真香是硬道理
  5. 是==和!=相互依赖?
  6. python,C语言求阶乘函数
  7. window mysql 同步复制_Window环境下配置MySQL 5.6的主从复制、备份恢复
  8. 微信js-sdk集成小结
  9. PHP字符串函数hex2bin( 转换十六进制字符串为二进制字符串)
  10. 最新王者荣耀发卡网源码,手机电脑自适应
  11. mysql数据库工资管理系统_数据库课程设计—企业工资管理系统(java版完整代码).doc...
  12. IT漫话第三篇:电影网站关联豆瓣评分
  13. 编写一个fun函数,该函数地功能是:统计一行字符串中单词的个数,并作为函数值返回。字符串在主函数中输入,规定所有的单词由小写字母组成,单词之间有若干个空格隔开,一行的开始没有空格!
  14. cms10——友情链接
  15. 【浏览器修改请求头】该地址不支持在浏览器打开,如需访问, 请使用微信扫描下方二维码
  16. Python 使用 matplotlib 将离散的节点用光滑曲线连接
  17. 查询我的订单功能的实现
  18. 数据链路层---差错检测和纠正
  19. 虚拟机服务器关机命令,linux虚拟机怎么关机命令
  20. 大势所趋话开源——中国开源现状分析

热门文章

  1. 淘宝装修前需要了解的css小技巧
  2. ArangoDB自学笔记(万字!!全!!)
  3. 阻塞队列(三):DelayQueue
  4. mac下hadoop环境的搭建
  5. PAT_乙级_1010_筱筱
  6. 小白成为大数据工程师 需掌握哪些知识技能
  7. 计算机毕业设计Java出彩校园信息交流平台(源码+系统+mysql数据库+lw文档)
  8. setTimeout expects a function as first argument but got undefined
  9. 图书云小程序体验版1.0.1发布
  10. redit mysql_如何搭建自己的网站?