LayoutInflater简介
LayoutInflater是一个抽象类,PhoneLayoutInflater继承于它。
LayoutInflater加载过程
1、通过getSystemServive()或LayoutInflater.from()获取一个LayoutInflater实例(实际获取的是PhoneLayoutInflater实例)。
2、layoutInflater.inflater()中解析xml的过程就是分析XML节点,主要由requestFocus、merge、include和普通节点(每种节点都有自己的处理方法)。在PhoneLayoutInflater中有一个数组,是一些package name的前缀,有
private static final String[] sClassPrefixList = { "android.widget.", "android.webkit.", "android.app." };
3、onCreateView方法通过解析到的Node Name和前缀拼接,如果能找到该类则创建一个实例并添加到创建的View中。
4、LayoutInflater.inflater(int layoutResID, ViewGroup root, bool attachToRoot)通过解析layout xml得到view,根据attachToRoot决定是否将得到的View添加到root中。
PS:如果root为null,默认不添加到root中。
使用场景
场景1:
Activity的setContentView(int layoutID)。如果Activity继承了FragmentActivity或Activity,最终会调用PhoneWindow中的setContentView()。setContentView(View view)会调用layoutInflater.inflater()解析出界面并通过addView(view)到父view中。
场景2:
ListView Adapter中的getItem,利用layoutInflater.inflate()直接获取界面。这里的rootView赋值为null。