實際開發中LayoutInflater這個類仍是很是有用的,它的 做用相似於findViewById()。html
不一樣點是LayoutInflater是用來找res/layout/下的xml佈局文件,而且實例化;佈局
而 findViewById()是找xml佈局文件下的具體widget控件(如Button、TextView等)。this
具體做用:二、對於一個已經載入的界面,就能夠使用Activiyt.findViewById()方法來得到其中的界面元素。url
LayoutInflater 是一個抽象類,在文檔中以下聲明:spa
public abstract class LayoutInflater extends Object code
得到 LayoutInflater 實例的三種方式xml
1. LayoutInflater inflater = getLayoutInflater(); //調用Activity的getLayoutInflater()htm
2. LayoutInflater localinflater = (LayoutInflater)context.getSystemServiceblog
(Context.LAYOUT_INFLATER_SERVICE);開發
3. LayoutInflater inflater = LayoutInflater.from(context);
其實,這三種方式本質是相同的,從源碼中能夠看出:
getLayoutInflater():
Activity 的 getLayoutInflater() 方法是調用 PhoneWindow 的getLayoutInflater()方法,看一下該源代碼:
1 public PhoneWindow(Context context) { 2 super(context); 3 mLayoutInflater = LayoutInflater.from(context); 4 }
能夠看出它實際上是調用 LayoutInflater.from(context)。
LayoutInflater.from(context):
1 public static LayoutInflater from(Context context) { 2 LayoutInflater LayoutInflater = 3 (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 4 if (LayoutInflater == null) { 5 throw new AssertionError("LayoutInflater not found."); 6 } 7 return LayoutInflater; 8 }
能夠看出它其實調用 context.getSystemService()。
結論:因此這三種方式最終本質是都是調用的Context.getSystemService()。
下面來看一個例子
LayoutInflater factory = LayoutInflater.from(LogActivity.this);