碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用广泛。

Fragment生命周期.png

Fragment与Activity生命周期.png
fragment也含有4种状态:
运行状态:
- 当一个碎片可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态。
暂停状态:
- 当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),与它相关的可见碎片进入停止状态。
停止状态:
- 当一个活动进入停止状态时,与它相关联的碎片就会进入到停止状态
- 通过调用FragmentTransaction的remove()、replace()方法将碎片从活动中移除,如果我们在事物提交之前调用了addToBackStack()方法,这时的碎片也会进入到停止状态。
总的来说,碎片的停止状态和活动的差不多对用户不可见、可能被系统回收。
销毁状态
- 当一个活动被销毁时,与它相关的碎片也进入销毁状态
- 通过调用FragmentTransaction的remove()、replace()方法将碎片从活动中移除,如果我们在事物提交之前没有调用addToBackStack()方法,这时的碎片就会进入到销毁状态。
回调方法
碎片的回调大部分与活动的差不多,其中不同的是:
onAttach(): 当碎片和活动建立关联时调用。
onCreateView():为碎片创建视图时调用。
onActivityCreated():确保与碎片相关联的活动一定已经创建完毕的时候调用。
onDestroyView():当与碎片关联的视图被移除的时候调用。
onDetach():当碎片和活动解除关联的时候调用。
使用限定符
我们可以在res文件下新建一个layout文件夹,例:

限定符样式.png
这里我们使用的是最小宽度限定符,其他的限定符见图:

限定符.jpg
使用了限定符后,Android系统会根据你的手机的分辨率自动读取相应的限定符layout。
简单的使用碎片:
- 写一个Fragment
public class NewFragment extends Fragment{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.new_frag,container,false); return view;
}
}
- 写layout
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/new_fragment"
android:name="soft.wc.com.fragmentbestpractice.fragment.NewFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
好了,我们使用了<fragment>标签在布局中添加碎片,其中需要注意的就是我们使用了name属性来显示指明要添加的碎片类名(一定要把类的包名加上)。
动态的添加碎片
碎片的强大之处在于,它可以在程序运行时动态地添加到活动中。
例:
NewFragment newFragment = new NewFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.news_content_layout,newFragment);
fragmentTransaction.commit();
动态添加碎片的步骤:
- 创建待添加的碎片实例;
- 获取FragmentManager,在活动中可以直接通过调用
getSupportFragmentManager()方法得到; - 开启一个事物,通过调用
beginTransaction()方法开启; - 向容器内添加或替换碎片,一般使用
replace()方法实现,需要传入容 器的id和待添加的碎片实例; - 提交事物,调用
commit()方法来完成。
Fragment可能会有两个不同包下的Fragment供你选择,一个是系统内置的android.app.Fragment,一个是support-v4库中android.support.v4.app.Fragment。这里建议使用support-v4库中的,因为它可以让碎片在所有Android系统版本中保持功能一致性。