Android学习笔记2-1--组件6--Fragment

来源:互联网 发布:阿普利亚200圣甲虫数据 编辑:程序博客网 时间:2024/06/11 14:40

简介

在Android3.0开始Android引入了Fragment。当初最主要的目的是为了给大屏幕设备提供更加灵活和动态的UI设计。随着应用功能越来越多和界面越来越复杂,我们会利用Fragment对Activity的界面进行模块化编程。比如一个Activity界面内有多个请求,每个请求得到的结果展示不同的UI片段,那么我们就可以将Activity利用Fragment来完成UI模块化。Fragment常用的三个类如下:

android.app.Fragment 主要用于定义Fragment
android.app.FragmentManager 主要用于在Activity中操作Fragment
android.app.FragmentTransaction 保证一些列Fragment操作的原子性

Fragment

Fragment必须依存与Activity而存在,因此Activity的生命周期会直接影响到Fragment的生命周期,但Fragment中创建的新线程并不会随着Activity的回收而被系统回收。一般我们对onCreateView动刀。




注意:如果正常结束Activity,onSaveInstanceState方法将不被调用。如果用户按下home键或者电源键等相关操作,将Activity置于后台,那么onSaveInstanceState将被调用。

因为在Fragment中有Context和Activity两个变量以及对应的获取函数,因此Context的方法,在Fragment中也可以使用。

Fragment的两种声明方式

1、在Activity布局中声明fragment。

<fragment        android:id="@+id/test"        android:name="com.test.android.TestFragment"        android:layout_width="match_parent"        android:layout_height="wrap_content"/>// 随后,在Activity通过如下方法初始化FragmentTestFragment fragment = (TestFragment)getFragmentManager().findFragmentById(R.id.test);

2、在代码中添加Fragment。

FragmentTransaction transaction = getFragmentManager().beginTransaction();TestFragment fragment = new TestFragment();transaction.add(R.id.container,fragment);//transaction.replace(R.id.container,fragment);transaction.commit();

FragmentManager

FragmentManager能够实现管理activity中fragment,通过调用activity的getFragmentManager()取得它的实例。

// 调用FragmentTransaction.addToBackStack()时会在Fragment回退堆栈创建一个这样项目实体interface FragmentManager.BackStackEntryFragmentManager.BackStackEntry getBackStackEntryAt(int index)// 把顶部/指定ID/指定name的状态弹出回退堆栈。// 这个方法是异步执行,即直到应用程序把控制权返回给事件循环之后才会执行这个操作void popBackStack()void popBackStack(int id, int flags)void popBackStack(String name, int flags)// 查找由给定的id/tag所标识的那个Fragment对象Fragment findFragmentById(int id)Fragment findFragmentByTag(String tag)// 把一个指定的Fragment对象放入一个Bundle对象中。// 这个Bundle对象能够作为持久的状态来保存,在后续调用getFragment会返回一个与当前实例相同的Fragment对象void putFragment(Bundle bundle, String key, Fragment fragment)Fragment getFragment(Bundle bundle, String key)// 添加/删除监听器,用于监听Fragment回退堆栈的变化void addOnBackStackChanageListener(FragmentManager.OnBackStackChangedListener)void removeOnBackStackChangedListener(FragmentManager.OnBackStackChangedListener)// 启动跟FragmentManager关联且与Fragment对象相关的一系列操作。注意Fragment事务只能在Activity保存其状态期间使用,如果在onSaveInstanceState()方法调用之后会发生错误FragmentTransaction beginTransaction()// 立即执行FragmentTransaction.commit()异步操作,注意该方法只能在主线程中调用boolean executePendingTransactions()

FragmentTransaction

// 重建/移除View// detach和remove不同的是此时fragment的状态依然由FragmentManager维护FragmentTransaction attach(Fragment fragment)FragmentTransaction detach(Fragment fragment)// 添加/移除fragmentFragmentTransaction add(@IdRes int containerViewId, Fragment fragment)FragmentTransaction remove(Fragment fragment)// 显示/隐藏当前Fragment,隐藏多的时候可能会出现OOMFragmentTransaction show(Fragment fragment)FragmentTransaction hide(Fragment fragment)// 将当前的事务添加到了回退栈(即按返回键后会回退当前的操作)FragmentTransaction addToBackStack(@Nullable String name)// 调用commit并不立即执行事务。它将事务安排排期, 一旦准备好,就在activity的UI线程上运行// 如果有必要, 可从UI线程调用executePendingTransactions()来立即执行由commit提交的事务int commit()int commitAllowingStateLoss()void commitNow()

还可以读一下这篇非常好的文章。

使用原则

如果喜欢使用Fragment,一定要清楚方法中哪个仅仅只是隐藏、哪个会销毁视图、哪个会销毁实例,这样才能更好的使用它们。

a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。
b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。
c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。

使用中容易出现的问题请转到这篇文章。

原创粉丝点击