知识背景

Fragment在当前的Android开发中,有两种引用方式,一个是 Android 3.0 时加入的,一个是supportV4包中的。这里简称为Fragment3.0FragmentV4

Fragment中的返回

在Fragment中经常用到自定义标题栏,而返回按钮的点击事件一般设置为:getActivity().onBackPressed();,这样可以使得点击返回按钮和点击手机上的返回键的效果一致,即调用所在Activity的onBackPressed();

那么可能会造成一个问题:

本来你是想点击返回按钮让当前的Fragment出栈,显示上一个Fragment,但是却关闭了整个Fragment所在的Activity

即 启动Activity–>显示FragmentA–>显示FragmentB–>用户点击返回按钮或者手机上的返回键–>退出了Activity。

原因

下面我们追踪一下代码调用,找找产生这种现象的原因:

Fragment 3.0getActivity().onBackPressed()

Activity类

public void onBackPressed() {
if (mActionBar != null && mActionBar.collapseActionView()) {
return;
} if (!mFragments.getFragmentManager().popBackStackImmediate()) {
finishAfterTransition();
}
}

Fragment V4getActivity().onBackPressed()

FragmentActivity

public void onBackPressed() {
if (!mFragments.getSupportFragmentManager().popBackStackImmediate()) {
supportFinishAfterTransition();
}
}

真相

从对代码调用的追踪,发现了真相。Fragment3.0FragmentV4

  1. Fragment3.0getActivity().onBackPressed()默认调用了ActivityonBackPressed()方法,方法里面使用的getFragmentManager()获取FragmentManager对象弹出栈内的Fragment3.0版的Fragment
  2. FragmentV4getActivity().onBackPressed()默认调用了FragmentActivityonBackPressed()方法,方法里面使用的getSupportFragmentManager()获取FragmentManager对象进行弹出栈内的FragmentV4版的Fragment

简单说就是Fragment3.0要放在继承了Activity的Activity中使用:

public class XXX_Activity extends Activity{
...
}

FragmentV4要放在继承了FragmentActivity的Activity中使用:

public class XXX_Activity extends FragmentActivity{
...
} //或者系统默认的 FragmentActivity 的子类 AppCompatActivity
public class XXX_Activity extends AppCompatActivity{
...
}

Fragment和Activity版本不匹配时

开发的时候,或许并不能达到Fragment版本和对应的Activity相匹配的理想状态,那么就有了下面的一个比较完善的解决方案:

解决方案:

使用其匹配的Activity类的onBackPressed()方法的代码重写所在的ActivityonBackPressed()方法:

FragmentV4配合继承了Activity的Activity中时:

XXX_Activity extends Activity

//使用FragmentActivity的onBackPressed()的代码覆盖
@Override
public void onBackPressed() {
if (!mFragments.getSupportFragmentManager().popBackStackImmediate()) {
supportFinishAfterTransition();
}
}

Fragment3.0配合继承了FragmentActivity的Activity中时:

XXX_Activity extends FragmentActivity(或者AppCompatActivity)

//使用Activity的onBackPressed()的代码覆盖
@Override
public void onBackPressed() {
if (mActionBar!=null&&mActionBar.collapseActionView()) {
return;
} if (!mFragments.getFragmentManager().popBackStackImmediate()) {
finishAfterTransition();
}
}

总结

由于当前 Android Studio 默认新建的 Activity 继承于 AppCompatActivity,所以建议大家使用FragmentV4进行开发,这样能省下不少麻烦,本系列还有一篇文章介绍Fragment3.0使用onAttach时的Bug,而这个对于FragmentV4则没有。

传送门:Android项目开发填坑记-Fragmen的onAttach方法

PS:

你可以关注的我GithubCSDN微博

Android项目开发填坑记-Fragment的onBackPressed的更多相关文章

  1. Android项目开发填坑记-Fragment的onAttach

    背景 现在Android开发多使用一个Activity管理多个Fragment进行开发,不免需要两者相互传递数据,一般是给Fragment添加回调接口,让Activity继承并实现. 回调接口一般都写 ...

  2. Android项目开发填坑记-so文件引发的攻坚战

    故事的最初 我负责的项目A要求有播放在线视频的功能,当时从别人的聊天记录的一瞥中发现百度有相关的SDK,当时找到的是Baidu-T5Player-SDK-Android-1.4s,项目中Demo的so ...

  3. Android项目开发填坑记-9patchPng报错

    如果阅读体验不佳,请使用–> Github版 背景 之前写了一篇文章Android必知必会–NinePatch图片制作详细介绍了Android 9Patch图片的制作和一些Demo展示,这次说明 ...

  4. Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72566261 本文出自[赵彦军的博客] Java web 开发填坑记 1-如何正确 ...

  5. Java Web 开发填坑记- 如何正确的下载 Eclipse

    一直以来,做 Java web 开发都是用 eclipse , 可是到 eclipse 官网一看,我的天 http://www.eclipse.org/downloads/eclipse-packag ...

  6. UiAutomator2.0升级填坑记

    UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sk ...

  7. Appium+python自动化(十三)- 输入中文 - 一次填坑记(超详解)

    简介 无论你在哪里,在做什么都会遇到很多坑,这些坑有些事别人挖的,有些是自己挖的.别人挖的叫坑人,自己挖的叫自杀,儿子挖的叫坑爹.因此在做app自动化道路上也不会是一帆风顺的,你会踩很多坑,这些坑和你 ...

  8. 浅谈html5 video 移动端填坑记

    这篇文章主要介绍了浅谈html5 video 移动端填坑记,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 本文介绍了html5 video 移动端填坑记,分享给大家,具体 ...

  9. Android项目开发全程(四)-- 将网络返回的json字符串轻松转换成listview列表

    前面几篇博文介绍了从项目搭建到获取网络字符串,对一个项目的前期整体工作进行了详细的介绍,本篇接着上篇介绍一下怎么样优雅将网络返回的json字符串轻松转换成listview列表. 先上图,看一下效果. ...

随机推荐

  1. 【网络流】【BZOJ1061】【NOI2008】志愿者招募

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1061 题意:问你如何购买志愿者使得满足题意的总费用最小. 解题思路:首先,由于志愿者存在的 ...

  2. 【HNOI2002】【矩阵快速幂】公交车路线

    仍然是学弟出的题目的原题@lher 学弟将题目改成了多组数据,n在ll范围内,所以我就只讲提高版的做法. 链接:https://www.luogu.org/problem/show?pid=2233 ...

  3. Django中Form的基本使用

    from django import forms from django.forms import fields class UserInfo(forms.Form): username = fiel ...

  4. mac下IDLE无法输入中文的问题

    解决方法是下载安装新版本的 Tcl/Tk 下载地址:http://www.activestate.com/activetcl/downloads 注意要下最新的8.5.18.0版本,安装好了再重启ID ...

  5. Python与C的简单比较(Python3.0)

    Python可以说是目前最火的语言之一了,人工智能的兴起让Python一夜之间变得家喻户晓,Python号称目前最最简单易学的语言,现在有不少高校开始将Python作为大一新生的入门语言.本萌新也刚开 ...

  6. expect IDENTIFIER, actual IDENTIFIER 处理

    涉及到注入数据库的报错,这是很常见的了. 但是期望IDENTIFIER,实际IDENTIFIER 的报错,你们知道是什么意思吗? 我已开始看到的时候,是mybatis报错发神经了,报错了报错.再跑一次 ...

  7. Luogu P1257 平面上的最接近点对_暴力

    这道题数据不大 两点距离用勾股定理求 #include<iostream> #include<cmath> using namespace std; struct node{ ...

  8. 反射 类的加载 Schema DOM 解析方式和解析器 命名空间

    Day15 反射 1.1 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. l 加载 就是指将class文件读入内存,并为之创建 ...

  9. Tomcat安装及问题排查方法

    简介: Apache Jakarta的开源项目 JSP/Servlet容器 安装: 1.1进入 Tomcat 官方下载地址 选择合适版本下载,并解压到本地. (备注)Tomcat 8.5 要求 JDK ...

  10. Throughtput收集器

    介绍 JVM里面的Throughtput收集器是一款关注吞吐量的垃圾收集器.该收集器是唯一一个实现了UseAdaptiveSizePolicy策略的收集器,允许用户通过指定最大暂停时间和垃圾收集时间占 ...