Fragment使用和介绍

Fragment简介

  • Fragment(碎片)是一种可以嵌入在Activity中的UI片段,它可以用来描述Activity中的一部分布局。

Fragment生命周期

  • Fragment不能独立存在,必须嵌入到Activity中使用,所有Frament生命周期直接接受所在的Activity影响。
  • 当在Activity中创建Fragment时,Fragment处于启动状态,当Activity被暂停时,其中的所有Fragment也被暂停,当Activity被销毁时,所有在该Activity中的Fragment也被销毁。当一个Activity处于运行状态时,可以单独地对每一个Fragment进行操作,如添加或删除,当添加时,Fragment处于启动状态。当删除时,Fragment处于销毁状态。
  • onAttach()方法:FragmentActivity建立关联的时候调用。
  • onCreateView()方法:Fragment创建视图(加载布局)时调用。
  • onActivityCreated()方法:Fragment相关的Activity已经创建完成时调用。
  • onDestriyView()方法:Fragment关联的视图被移除时调用。
  • onDetach()方法:FragmentActivity解除关联的时候调用。

创建Fragment

创建一个NewsListFragment.java文件写入下面的内容。

public class NewsListFragment extends Fragment {
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment, container, false);
        return v;
    }
}

注意:Android系统中提供了两个Fragment类,分别时android.app.Fragment和android.suppor.v4.app.Fragment。如果NewsListFragment类继承的是android.app.Fragment类,则程序只能兼容3.0版本以上的安卓系统,如果NewsListFragment类继承的是android.support.v4.Fragment类,则程序可以兼容1.6版本以上的安卓系统。

inflate()方法

/**
 * 从指定的xml资源中添加新的视图层次结构。
 * {@link InflateException} if there is an error.
 *
 * @param resource 要加载的XML布局资源的ID
 * @param root 可选视图为生成的层次结构的父级(如果attachToRoot为true),或者只是一个对象,该对象为返回的层次结构的根提供
 *             一组LayoutParams值(如果attachToRoot为假。)
 * @param attachToRoot 膨胀后的层次结构是否应附加到根参数?如果为false,则root仅用于为XML中的根视图创建LayoutParams的正确子类。
 * @return 膨胀层次结构的根视图。如果提供了root且AttachToRoot为true,则为root;否则,它是膨胀的XML文件的根。
 */
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {
        final Resources res = getContext().getResources();
        if (DEBUG) {
            Log.d(TAG, "INFLATING from resource: \"" + res.getResourceName(resource) + "\" ("
                  + Integer.toHexString(resource) + ")");
        }

        View view = tryInflatePrecompiled(resource, res, root, attachToRoot);
        if (view != null) {
            return view;
        }
        XmlResourceParser parser = res.getLayout(resource);
        try {
            return inflate(parser, root, attachToRoot);
        } finally {
            parser.close();
        }
    }

在Activity中添加Fragment

布局文件添加Fragment

  • Activity中使用Fragment时,可以通过两种方式就Fragment添加到Activity中,一种时通过布局文件添加,一种时通过代码动态添加。
  • 通过布局文件添加Fragment
<fragment 
    android:name =“ com.example.listview.NewsListFragment” 
    android:id =“ @ + id / newsList” 
    android:layout_width =“ match_parent” 
    android:layout_height =“ match_parent”> 
    ... 
</ fragment>

动态添加Fragment

  • Activity中动态添加Fragment的步骤。
    • 创建需要一个Fragment的实例对象。
    • 获取FragmentManager(Fragment管理员)的实例。
    • 开启FragmentTransaction(事务)。
    • Activity的布局容器(一般为FrameLayout)中添加Fragment
    • 通过commit()方法提交事务。
NewsListFragment= new NewsListFragment(); 
FragmentManager fm = getSupportFragmentManager(); 
FragmentTransaction beginTransaction = fm.beginTransaction(); 
beginTransaction.replace(R.id.newsList,片段); 
beginTransaction.commit();
ins: honoka.hirano