`
wcgdonot
  • 浏览: 91922 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Fragment Management

阅读更多
  • FragmentManager

  使用FragmentManager管理Activity中的fragments,调用Activity中的getFragmentManager()方法。

  因为FragmentManager的API是在Android 3.0,也即API level 11开始引入的,所以兼容之前的版本,需要使用support library中的FragmentActivity,并且使用getSupportFragmentManager()方法。

 

 得到Activity中存在的fragment:使用findFragmentById()或findFragmentByTag()方法。

 

popBackStack():将back stack中最后一次的fragment转换弹出。如果没有可以出栈的东西,返回false。

这个函数是异步的:它将弹出栈的请求加入队列,但是这个动作直到应用回到事件循环才会执行。

 

为back stack加上监听器:addOnBackStackChangedListener()

 

  • Performing Fragment Transactions

  使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。所有这些改变构成一个集合,这个集合被叫做一个transaction。

  可以调用FragmentTransaction中的方法来处理这个transaction,并且可以将transaction存进由activity管理的back stack中,这样用户就可以进行fragment变化的回退操作。

  可以这样得到FragmentTransaction类的实例: 

 

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

  每个transaction是一组同时执行的变化的集合。

  用add(), remove(), replace()方法,把所有需要的变化加进去,然后调用commit()方法,将这些变化应用。

  在commit()方法之前,你可以调用addToBackStack(),把这个transaction加入back stack中去,这个back stack是由activity管理的,当用户按返回键时,就会回到上一个fragment的状态。

  比如下面的代码就是用一个新的fragment取代之前的fragment,并且将前次的状态存储在back stack中。

 

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
 
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
 
// Commit the transaction
transaction.commit();

  在这个例子中,newFragment将取代在R.id.fragment_container容器中的fragment,如果没有,将直接添加新的fragment。

  通过调用addToBackStack(),commit()的一系列转换作为一个transaction被存储在back stack中,用户按Back键可以返回上一个转换前的状态。

  当你移除一个fragment的时候,如果commit()之前没有调用addToBackStack(),那个fragment将会是destroyed;如果调用了addToBackStack(),这个fragment会是stopped,可以通过返回键来恢复。

      如果添加多个变化到事务(例如add()或remove())并调用addToBackStack(), 然后在你调用commit()之前的所有应用的变化会被作为一个单个事务添加到后台堆栈, BACK按键会将它们一起回退.

 

关于commit()方法

  调用commit()方法并不能立即执行transaction中包含的改变动作,commit()方法把transaction加入activity的UI线程队列中。

  但是,如果觉得有必要的话,可以调用executePendingTransactions()方法来立即执行commit()提供的transaction。

  这样做通常是没有必要的,除非这个transaction被其他线程依赖。

  注意:你只能在activity存储它的状态(当用户要离开activity时)之前调用commit(),如果在存储状态之后调用commit(),将会抛出一个异常。

这是因为当activity再次被恢复时commit之后的状态将丢失。如果丢失也没关系,那么使用commitAllowingStateLoss()方法。

 

 

添加变化到 FragmentTransaction的顺序不重要, 除以下例外:
  • 必须最后调用 commit().
  • 如果添加多个fragment到同一个容器, 那么添加的顺序决定了它们在view hierarchy中显示的顺序.
当执行一个移除fragment的事务时, 如果没有调用 addToBackStack(), 那么当事务提交后, 那个fragment会被销毁,并且用户不能导航回到它. 有鉴于此, 当移除一个fragment时,如果调用了 addToBackStack(), 那么fragment会被停止, 如果用户导航回来,它将会被恢复.
提示: 对于每一个fragment事务, 你可以应用一个事务动画, 通过在提交事务之前调用setTransition()实现.
调用 commit() 并不立即执行事务.恰恰相反, 它将事务安排排期, 一旦准备好, 就在activity的UI线程上运行(主线程).如果有必要, 无论如何, 你可以从你的UI线程调用 executePendingTransactions() 来立即执行由commit()提交的事务. 但这么做通常不必要, 除非事务是其他线程中的job的一个从属.
分享到:
评论

相关推荐

    猎豹"快切App"中用到的Android开发技巧

    3. **碎片管理(Fragment Management)**: 在多屏幕适配和复杂布局设计中,`Fragment`是一个常用工具。在"猎豹"快切App"中,可能使用了多个`Fragment`来构建不同的功能区域,通过`FragmentManager`进行添加、删除...

    A back-end management system based on SpringBoot+Vue3。

    标题 "A back-end management system based on SpringBoot+Vue3" 提供了项目的关键技术栈,即后端管理系统是建立在SpringBoot框架之上,并且前端采用了Vue3。这表明这是一个结合了现代Java微服务架构和最新...

    AndroidDemo.rar

    6. **布局管理(Layout Management)**:在Android应用中,需要合理地组织和管理UI元素的布局。在这里,可能包括使用RelativeLayout、LinearLayout或者ConstraintLayout等布局来构建各个页面。 7. **事件监听**:在...

    android 主界面 底部菜单 DEMO

    5. **布局管理(Layout Management)**: 在DEMO中,底部菜单的布局可能使用了`CoordinatorLayout`或`FrameLayout`等容器来管理`BottomNavigationView`和上面显示的Fragment。`CoordinatorLayout`可以配合`...

    Homework-time-management-system-android:作业时间管理系统客户端

    应用的用户界面通常由Activity和Fragment组成,它们分别负责主屏幕和各个功能模块的展示。使用Android的布局组件如LinearLayout、RelativeLayout或ConstraintLayout构建界面,并通过XML定义布局结构。此外,Adapter...

    安卓Android源码——做了四个界面的滑动功能,设置了每个界面的移动动画操作.zip

    5. **布局管理(Layout Management)**: 界面的滑动切换通常需要合适的布局管理器来排列和组织`View`。例如,`LinearLayout`, `RelativeLayout`, 或`ConstraintLayout`等布局可以根据需求调整`View`的位置,配合...

    手机游戏开发实例(smartphone联机炸弹人)

    c++ wince sdk AI <br>smartphone版本 和windows版本 <br>目录 Table of content I. Introduction....................................................................................................

    基于Android的亲,微信高仿导航页开门效果.zip

    2. **布局管理(Layout Management)**:为了实现导航页的布局,可能使用了LinearLayout、RelativeLayout、ConstraintLayout等布局。特别是ConstraintLayout,它允许开发者在界面上创建复杂的布局,同时支持动画效果...

    Android应用源码之超炫丽viewpager用户引导.zip

    10. **LifeCycle Management(生命周期管理)**:在使用ViewPager和Fragment时,了解并正确处理Fragment的生命周期是非常重要的,尤其是在内存有限的移动设备上。 11. **Testing(测试)**:对于这样的用户引导,...

    events-management-app:事件管理Android应用程序的源代码-Android app source code

    【文件名称列表】中的"events-management-app-master"可能表示这是一个Git仓库的主分支,通常包含应用程序的全部源代码、资源文件、配置文件以及版本控制信息。开发者可以通过这个文件来克隆项目,然后在本地环境中...

    Android应用源码之OssSystem(OA系统图书管理简单版).zip

    2. **布局管理(Layout Management)** - Android提供了多种布局管理器,如LinearLayout、RelativeLayout、ConstraintLayout等。源码中会使用这些布局来组织UI元素,实现屏幕适配和响应式设计。 3. **数据存储** ...

    Android应用源码之MyDateTimePickerDialog.zip

    由于`MyDateTimePickerDialog`是`Fragment`的一个实例,它遵循Fragment的生命周期。了解何时创建、显示、隐藏和销毁对话框,以及如何正确处理配置变更(如屏幕旋转),对于确保代码的健壮性至关重要。 8. **权限...

    Android 5.0 samples

    3. Fragment Transactions:在Android 5.0中,对Fragment的管理得到了增强,可以更方便地进行事务操作,例如添加、移除或替换Fragment。示例代码会演示如何使用`FragmentManager`进行这些操作。 4. JobScheduler:...

    安卓开发-GuideViewDemo(超炫丽用户引导).zip

    2. **布局管理(Layout Management)**:为了在屏幕上正确地定位引导视图,开发者需要掌握LinearLayout、RelativeLayout、ConstraintLayout等布局的使用,以及如何通过XML或代码动态设置布局属性。 3. **动画效果...

    WarehouseManagement.zip

    2. **后端逻辑处理**:Android应用的业务逻辑主要在Activity或Fragment中实现,通过监听用户的操作,调用相应的服务进行数据处理。在这个仓库管理系统中,出库和入库操作涉及到数据的增删,而数据导出则需要读取...

    OpenGL SuperBible 5th Edition.pdf

    • Fragment operations: controlling the end of the graphics pipeline • Advanced shader usage and geometry management • A fully updated API reference, now based on the official ARB (Core) OpenGL ...

    安卓Android源码——仿乐淘的应用界面源码.zip

    8. **状态管理(State Management)**:如使用ViewModel和LiveData实现数据在配置变更时的保存和恢复。 9. **权限管理(Permissions)**:如果应用涉及到读写文件或访问位置等敏感操作,会涉及Android的运行时权限...

    Android项目导航菜单横向左右滑动并和下方的控件实现联动.rar

    4. **布局管理(Layout Management)** - 使用`ConstraintLayout`或`RelativeLayout`等布局管理器可以方便地实现视图之间的关联和联动。例如,当导航菜单打开时,可以约束主内容区域的宽度或透明度以响应变化。 5. *...

    android应用源码仿微信用户引导页源码.zip

    6. **Activity与Fragment管理**:引导页完成后,通常会跳转到主界面,涉及Activity的生命周期管理和Fragment的使用。 7. **版本控制**:源码可能包含了版本控制信息(如Git),帮助开发者追踪代码变更。 【压缩包子...

    Cisco_IOS_Router_Exploitation.pdf

    其他今年加入到IOS的服务包括VoIP, SSL VPN, 包过滤Web Service Management Agent(SOAP),XML-PI和H.323 Client Side Vulnerabilities:But up until now, client side vulnerabilities have not played any role ...

Global site tag (gtag.js) - Google Analytics