Android中Fragment的嵌套问题

本文解答了在Android开发中遇到的Fragment嵌套问题,包括异常原因、解决方案及使用建议,涉及Android 4.2版本及更高版本的兼容性讨论。

Android中Fragment的嵌套问题

卢旭|2013-12-05 13:40|47754次浏览| 移动开发(232)SOF(124)Android(219) 0

本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术,本文为大家讲解如何解决Android中Fragment的嵌套问题。

问:Graeme

我想知道这是否是Android API中的一个bug:

我进行了如下设置:

1代表一个在右侧负载2号fragment(一个搜索屏)的menu;

2代表一个包含3号fragment(一个result list)搜索屏;

3代表一个用于不同环境中的结果列表(result list),

在1,2和3号fragment作为ActivityFragment时,它们在手机上都可以正常运行。

但当我使用如下代码:

1
2
3
4
5
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();      
     Fragment frag = new FragmentNumber2();
     if (toLoad != null ) frag.setArguments(toLoad);
     transaction.replace(R.id.rightPane, frag);     
     transaction.commit();

其中R.id.leftPaneR.id.rightPane是linear layout在水平方向上的<fragment>

我之前认为,上述代码是删除了原有的fragment,添加了一个新的fragment。很明显,我的理解不完全正确,因为当代码第二次执行命令的时候,你会看到:

1
07-27 15:22:55.940: ERROR/AndroidRuntime(8105): Caused by: java.lang.IllegalArgumentException: Binary XML file line #57: Duplicate id 0x7f080024, tag null, or parent id 0x0 with another fragment for FragmentNumber3

造成这种结果主要是由于FragmentNumber3被复制,不再具备唯一的ID。而在此之前,1号fragment并未被破坏,请问这是Android中的bug吗?

答:hackbod

(最佳答案)

这种异常是嵌套片段(nested fragment)与系统版本不相容导致的,而嵌套片段通常支持Android4.2。一个fragment的UI中嵌套另一个fragment,极有可能会造成程序运作异常。

注:嵌套片段只能在动态添加的操作中完成,也就是说,当layout中已经包含了一个<fragment>,就不能将再将这个layout嵌入到fragment中。

答:furykid

你可以用destroyview的方法清理parent fragment中的嵌套片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
     public void onDestroyView() {
 
       try {
         FragmentTransaction transaction = getSupportFragmentManager()
                 .beginTransaction();
 
         transaction.remove(nestedFragment);
 
         transaction.commit();
       } catch (Exception e){
       }
 
         super .onDestroyView();
     }

答:Reneez

你可以用ViewPager来添加进更多的fragment。目前, Android Support Library可以支持嵌套片段,所以你可以在Android 1.6及以上版本进行嵌套操作。只要调用Fragment中的getChildFragmentManager()命令,就可以完成添加操作。例如,下述代码就可以完成在现有的Fragment class中添加fragment的操作:

1
2
3
Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

答:draksia

我在开发应用的过程中,也遇到过类似的问题,所以我用Linearlayout替换了xml文件中所有的fragment,然后在测试的环境下,用Fragment manager/ fragment transaction,对所有fragment逐一排查,最后程序可以正常运作。

原文链接:http://stackoverflow.com/questions/6847460/fragments-within-fragments


Android中error inflating class fragment

分类: Android实战2012-12-29 21:25 7563人阅读 评论(6) 收藏 举报

在Activity中静态使用fragment的时候,要注意两个地方。

Fragment引用的包是:

import android.support.v4.app.Fragment;
而不是:

import android.app.Fragment;

然后Activity必须是继承FragmentActivity
import android.support.v4.app.FragmentActivity;

不然就会出现这个错误。


调用fragment的生命周期函数的方式:

1.oncreate() 中 写纯数据

2.oncreteviews() 中加载控件

3.用inflater 定义整个fragment的view,然后用view获取其他控件,尽量不用getActivity(),使用时可加判断getActvity()为不为空






理解Fragment生命周期

分类: Android的深入2012-11-29 14:33 62852人阅读 评论(24) 收藏 举报

官网帮助文档链接:
 http://developer.android.com/guide/components/fragments.html

主要看两张图,和跑代码

一,Fragment的生命周 

          

二,与Activity生命周期的对比

     

场景演示 : 切换到该Fragment

11-29 14:26:35.095: D/AppListFragment(7649): onAttach
11-29 14:26:35.095: D/AppListFragment(7649): onCreate
11-29 14:26:35.095: D/AppListFragment(7649): onCreateView
11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated
11-29 14:26:35.120: D/AppListFragment(7649): onStart
11-29 14:26:35.120: D/AppListFragment(7649): onResume

屏幕灭掉:

11-29 14:27:35.185: D/AppListFragment(7649): onPause
11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState
11-29 14:27:35.205: D/AppListFragment(7649): onStop

屏幕解锁

11-29 14:33:13.240: D/AppListFragment(7649): onStart
11-29 14:33:13.275: D/AppListFragment(7649): onResume

切换到其他Fragment:
11-29 14:33:33.655: D/AppListFragment(7649): onPause
11-29 14:33:33.655: D/AppListFragment(7649): onStop
11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView

切换回本身的Fragment:

11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
11-29 14:33:55.825: D/AppListFragment(7649): onStart
11-29 14:33:55.825: D/AppListFragment(7649): onResume

回到桌面

11-29 14:34:26.590: D/AppListFragment(7649): onPause
11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState
11-29 14:34:26.880: D/AppListFragment(7649): onStop

回到应用

11-29 14:36:51.940: D/AppListFragment(7649): onStart
11-29 14:36:51.940: D/AppListFragment(7649): onResume

退出应用

11-29 14:37:03.020: D/AppListFragment(7649): onPause
11-29 14:37:03.155: D/AppListFragment(7649): onStop
11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView
11-29 14:37:03.165: D/AppListFragment(7649): onDestroy
11-29 14:37:03.165: D/AppListFragment(7649): onDetach

比Activity多了一些生命周期,完整和Activity对接上,大家好好利用。


内容概要:本文系统阐述了Java Persistence API(JPA)的核心概念、技术架构、核心组件及实践应用,重点介绍了JPA作为Java官方定义的对象关系映射(ORM)规范,如何通过实体类、EntityManager、JPQL和persistence.xml配置文件实现Java对象与数据库表之间的映射与操作。文章详细说明了JPA解决的传统JDBC开发痛点,如代码冗余、对象映射繁琐、跨数据库兼容性差等问题,并解析了JPA与Hibernate、EclipseLink等实现框架的关系。同时提供了基于Hibernate和MySQL的完整实践案例,涵盖Maven依赖配置、实体类定义、CRUD操作实现等关键步骤,并列举了常用JPA注解及其用途。最后总结了JPA的标准化优势、开发效率提升能力及在Spring生态中的延伸应用。 适合人群:具备一定Java基础,熟悉基本数据库操作,工作1-3年的后端开发人员或正在学习ORM技术的中级开发者。 使用场景及目标:①理解JPA作为ORM规范的核心原理与组件协作机制;②掌握基于JPA+Hibernate进行数据库操作的开发流程;③为技术选型、团队培训或向Spring Data JPA过渡提供理论与实践基础。 阅读建议:此资源以理论结合实践的方式讲解JPA,建议读者在学习过程中同步搭建环境,动手实现文中示例代码,重点关注EntityManager的使用、JPQL语法特点以及注解配置规则,从而深入理解JPA的设计思想与工程价值。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值