android的fragment作用,《Android Fragment 非常详细的一篇》

导语: Fragment作为Android最基本,最重要的基础概念之一,在开发中经常会和他打交道。本文从为什么出现Fragment开始,介绍了Fragment相关的方方面面,包括Fragment的基本定义及使用、回退栈的内部实现、Fragment通信、DialogFragment、ViewPager+Fragment的使用、嵌套Fragment、懒加载等。

基本概念

Fragment,简称碎片,是Android 3.0(API 11)提出的,为了兼容低版本,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6。

过去support-v4库是一个jar包,24.2.0版本开始,将support-v4库模块化为多个jar包,包含:support-fragment, support-ui, support-media-compat等,这么做是为了减少APK包大小,你需要用哪个模块就引入哪个模块。

如果想引入整个support-v4库,则compile 'com.android.support:support-v4:24.2.1',如果只想引入support-fragment库,则com.android.support:support-fragment:24.2.1。

因为support库是不断更新的,因此建议使用support库中的android.support.v4.app.Fragment,而不要用系统自带的android.app.Fragment。而如果要使用support库的Fragment,Activity必须要继承FragmentActivity(AppCompatActivity是FragmentActivity的子类)。

Fragment是依赖于Activity的,不能独立存在的。

一个Activity里可以有多个Fragment。

一个Fragment可以被多个Activity重用。

Fragment有自己的生命周期,并能接收输入事件。

我们能在Activity运行时动态地添加或删除Fragment。

Fragment的优势有以下几点:

模块化(Modularity):我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。

可重用(Reusability):多个Activity可以重用一个Fragment。

可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。

基本使用

这里给出Fragment最基本的使用方式。首先,创建继承Fragment的类,名为Fragment1:

public class Fragment1 extends Fragment{

private static String ARG_PARAM = "param_key";

private String mParam;

private Activity mActivity;

public void onAttach(Context context) {

mActivity = (Activity) context;

mParam = getArguments().getString(ARG_PARAM); //获取参数

}

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View root = inflater.inflate(R.layout.fragment_1, container, false);

TextView view = root.findViewById(R.id.text);

view.setText(mParam);

return root;

}

public static Fragment1 newInstance(String str) {

Fragment1 frag = new Fragment1();

Bundle bundle = new Bundle();

bundle.putString(ARG_PARAM, str);

fragment.setArguments(bundle); //设置参数

return fragment;

}

}

Fragment有很多可以复写的方法,其中最常用的就是onCreateView(),该方法返回Fragment的UI布局,需要注意的是inflate()的第三个参数是false,因为在Fragment内部实现中,会把该布局添加到container中,如果设为true,那么就会重复做两次添加,则会抛如下异常:

Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

如果在创建Fragment时要传入参数,必须要通过setArguments(Bundle bundle)方式添加,而不建议通过为Fragment添加带参数的构造函数,因为通过setArguments()方式添加,在由于内存紧张导致Fragment被系统杀掉并恢复(re-instantiate)时能保留这些数据。官方建议如下:

It is strongly recommended that subclasses do not have other constructors with parameters, since these constructors will not be called when the fragment is re-instantiated.

我们可以在Fragment的onAttach()中通过getArguments()获得传进来的参数,并在之后使用这些参数。如果要获取Activity对象,不建议调用getActivity(),而是在onAttach()中将Context对象强转为Activity对象。

创建完Fragment后,接下来就是把Fragment添加到Activity中。在Activity中添加Fragment的方式有两种:

静态添加:通过xml的方式添加,缺点是一旦添加就不能在运行时删除。

动态添加:运行时添加,这种方式比较灵活,因此建议使用这种方式。

虽然Fragment能在XML中添加,但是这只是一个语法糖而已,Fragment并不是一个View,而是和Activity同一层次的。

这里只给出动态添加的方式。首先Activity需要有一个容器存放Fragment,一般是FrameLayout,因此在Activity的布局文件中加入FrameLayout:

android:id="@+id/container"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

然后在onCreate()中,通过以下代码将Fragment添加进Activity中。

if (bundle == null) {

getSupportFragmentManager().beginTransaction()

.add(R.id.container, Fragment1.newInstance("hello world"), "f1") //.addToBackStack("fname")

.commit();

}

这里需要注意几点:

因为我们使用了support库的Fragment,因此需要使用getSupportFragmentManager()获取FragmentManager。

add()是对Fragment众多操作中的一种,还有remove(), replace()等,第一个参数是根容器的id(FrameLayout的id,即”@id/container”),第二个参数是

你可能感兴趣的:(android的fragment作用,《Android Fragment 非常详细的一篇》)