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

回调接口一般都写在Fragment的 onAttach() 方法中,Fragment 3.0 的onAttach() 方法有2个重载,其中一个被废弃,所以通常是:

XX_Fragment extends Fragment(Fragment 3.0)

  1. @Override
  2. public void onAttach(Context context) {
  3. if (context instanceof OnCoverChangeListener) {
  4. mListener = (ABC_Listener) context;
  5. } else {
  6. throw new RuntimeException(context.toString()
  7. + " must implement ABC_Listener");
  8. }
  9. super.onAttach(context);
  10. }

但是在一些特定的Android版本下,这个 onAttach(Context context) 并未被调用,而是调用了 废弃的 onAttach(Activity activity) 方法。

解决方案

如果使用了Fragment 3.0,并且用到了自定义回调,那么为了兼容,需要:

  1. @Override
  2. public void onAttach(Context context) {
  3. if (context instanceof OnCoverChangeListener) {
  4. mListener = (ABC_Listener) context;
  5. } else {
  6. throw new RuntimeException(context.toString()
  7. + " must implement ABC_Listener");
  8. }
  9. super.onAttach(context);
  10. }
  11.  
  12. //SDK API<23时,onAttach(Context)不执行,需要使用onAttach(Activity)。Fragment自身的Bug,v4的没有此问题
  13. @Override
  14. public void onAttach(Activity activity) {
  15. super.onAttach(activity);
  16. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
  17. if (activity instanceof OnCoverChangeListener) {
  18. mListener = (ABC_Listener) activity;
  19. } else {
  20. throw new RuntimeException(activity.toString()
  21. + " must implement ABC_Listener");
  22. }
  23. }
  24.  
  25. }

总结

建议使用FragmentV4版的,减少不必要的系统自身Bug的处理。

还有一篇关于FragmentV4、Fragment3.0的 onBackPressed(); 的Bug详解:

传送门:

Android项目开发填坑记-Fragmen的onBackPressed

原文:http://likfe.github.io/2016/04/20/fragmen-onAttach/?utm_source=tuicool&utm_medium=referral

Fragmen的onAttach方法的更多相关文章

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

    Github版 CSDN版 知识背景 Fragment在当前的Android开发中,有两种引用方式,一个是 Android 3.0 时加入的,一个是supportV4包中的.这里简称为Fragment ...

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

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

  3. Android开发中,那些让您觉得相见恨晚的方法、类或接口

    Android开发中,那些让你觉得相见恨晚的方法.类或接口本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常 ...

  4. FragmentActivity与Fragment两者交互方法简介(转)

    FragmentActivity与Fragment两者交互方法简介 分类: Fragment 2014-07-07 18:17 88人阅读 评论(0) 收藏 举报 在Android4.0后很多时候我们 ...

  5. Android开发中,那些让你觉得相见恨晚的方法、类或接口

    Throwable类中的getStackTrace()方法,根据这个方法可以得到函数的逐层调用地址,其返回值为StackTraceElement[],而在StackTraceElement类中有四个方 ...

  6. Android30-Fragment-理解

        Android30-Fragment-理解 规范 mobileSafe V2.0 欢迎页面 用户第一次是否需要用户提示 新闻类app的数据是怎么获取的 知乎提问?如何把身边资源最大化 第二种就 ...

  7. fragment 数据传递,传值,通信

    [原][Fragment精深系列4]Fragment与Activity之间的数据交互 2015-5-26阅读389 评论0   以下内容来自于自己的实践和网络资料的整理,希望对你有帮助. 一.Acti ...

  8. Android进阶之Fragment与Activity之间的数据交互

    1 为什么 因为Fragment和Activity一样是具有生命周期,不是一般的bean通过构造函数传值,会造成异常. 2 Activity把值传递给Fragment 2.1 第一种方式,也是最常用的 ...

  9. 关于Fragment你所需知道的一切!

    转载自刘明渊 的博客地址:http://blog.csdn.net/vanpersie_9987 Fragment 是 Android API 中的一个类,它代表Activity中的一部分界面:您可以 ...

随机推荐

  1. Springboot + SLF4j + Log4j2 打印异常日志时,耗时要5-6秒

    1.使用jps -l 查看springboot项目的进程ID 2.使用命令jstack -l 进程ID > log.txt 打印堆栈信息到文件,内容如下: "http-nio-8065 ...

  2. 手机中快速看图,浏览编辑DWG 梦想极光CAD

    梦想极光CAD6.0(2016.3.1) 手机版最新更新 1.增加手机上,图纸浏览时预览功能 2.增加直接从手机,QQ接收目录下加载文件功能 3.手机交互界面优化 4.增加新建图纸功能 5.增加缓存功 ...

  3. vuex与redux,我们都一样

    vuex与redux的主要区别: redux:生成的全局数据流是通过每个组件的props逐层传递到各个子组件的,通过@connect装饰器绑定在this.props上面. vuex :生成的全局数据则 ...

  4. day02 Python完结

    一. 常用数据类型及内置法 1 列表 定义: 列表是Python中内置有序.可变序列,列表的所有元素放在一对中括号“[]”中,并使用逗号分隔开: 当列表元素增加或删除时,列表对象自动进行扩展或收缩内存 ...

  5. SQL删除重复数据(根据多个字段),pandas的nan存入数据库报错

    delete from M_FACTOR_DATA_TEST a where (a.factor_id,a.data_date,a.stock_code) in (select factor_id,d ...

  6. POJ P2096 Collecting Bugs

    思路 分类讨论,不妨先设$DP[i][j]$表示已经发现$i$种子系统中有$n$种$bug$无非只有四种情况 发现的$bug$在旧的系统旧的分类,概率$p1$是$(i/s)*(j/n)$. 发现的$b ...

  7. Moving Tables POJ - 1083 (思维)

    题目大意 在一层楼上推桌子,每个空间一次只能推1种桌子,且消耗十分钟.可以同时推多个桌子,但是他们所占的空间不能是相交的如图 解法 真的很考验思维能力,首先考虑到这个走廊是有两排的,我瞬间想到了宿舍楼 ...

  8. centos 7桌面和命令行转行

    CentOS7图形界面与命令行界面(终端)切换(1)CentOS7 在图形界面进入dos界面 :ctrl+alt+F6 dos界面进入图形界面:ctrl+alt+F2 本机用的这个命令: (2)Cen ...

  9. java一维数组的声明、初始化及排序

    public class TestArray { public static void main(String[] args) { /** 数组声明及动态初始化 int a[] = new int[a ...

  10. db2构建临时结果集

    一 values  ('1',2,3)   为一行   ‘1’   2    3   行数据类型可以不同  values  ('1',2,3),('f',5,6) 为两行 (values  1,2,3 ...