【转】 Android - LayoutInflate用法
【轉自】http://blog.csdn.net/scut1135/article/details/7055461
通俗的說,inflate就相當于將一個xml中定義的布局找出來.
因為在一個Activity里如果直接用findViewById()的話,對應的是setConentView()的那個layout里的組件.
因此如果你的Activity里如果用到別的layout,比如對話框上的layout,你還要設置對話框上的layout里的組件(像圖片ImageView,文字TextView)上的內容,你就必須用inflate()先將對話框上的layout找出來,然后再用這個layout對象去找到它上面的組件,如:
View view = View.inflate(this, R.layout.dialog_layout, null);
TextView dialogTV = (TextView) view.findViewById(R.id.dialog_tv);
dialogTV.setText("abcd");
如果組件R.id.dialog_tv是對話框上的組件,而你直接用this.findViewById(R.id.dialog_tv)肯定會報錯.
?
三種方式可以生成LayoutInflater?:
LayoutInflater inflater = LayoutInflater.from(this);
LayoutInflater inflater = getLayoutInflater();
LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
然后調用inflate方法將xml布局文件轉成View
public View inflate (int resource, ViewGroup root, boolean attachToRoot)
在View類中,也有inflate方法
public static View inflate (Context context, int resource, ViewGroup root)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Android - LayoutInflate用法 2011-09-15 11:21
在實際開發中LayoutInflater這個類還是非常有用的,它的作用類似于findViewById()。不同點是LayoutInflater是用來找res/layout/下的xml布局文件,并且實例化;而findViewById()是找xml布局文件下的具體widget控件(如Button、TextView等)。
具體作用:
1、對于一個沒有被載入或者想要動態載入的界面,都需要使用LayoutInflater.inflate()來載入;
2、對于一個已經載入的界面,就可以使用Activiyt.findViewById()方法來獲得其中的界面元素。
LayoutInflater 是一個抽象類,在文檔中如下聲明:
public?abstract?class?LayoutInflater?extends?Object??
?
獲得 LayoutInflater 實例的三種方式
1.?LayoutInflater?inflater?=?getLayoutInflater();??//調用Activity的getLayoutInflater()
2.?LayoutInflater localinflater =??(LayoutInflater)context.getSystemService
?????????????????????????????????????????????????(Context.LAYOUT_INFLATER_SERVICE);
3.?LayoutInflater?inflater?=?LayoutInflater.from(context);???
?
其實,這三種方式本質是相同的,從源碼中可以看出:
getLayoutInflater():
Activity 的 getLayoutInflater() 方法是調用 PhoneWindow 的getLayoutInflater()方法,看一下該源代碼:
public?PhoneWindow(Context?context)?{??????????super(context);??????????mLayoutInflater?=?LayoutInflater.from(context);??}??
可以看出它其實是調用 LayoutInflater.from(context)。
?
LayoutInflater.from(context):
public?static?LayoutInflater?from(Context?context)?{ ??????LayoutInflater?LayoutInflater?= ??????????????(LayoutInflater)?context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); ??????if?(LayoutInflater?==?null)?{ ??????????throw?new?AssertionError("LayoutInflater?not?found."); ??????} ??????return?LayoutInflater; ??}?
可以看出它其實調用 context.getSystemService()。
?
結論:所以這三種方式最終本質是都是調用的Context.getSystemService()。
?
inflate 方法
通過 sdk 的 api 文檔,可以知道該方法有以下幾種過載形式,返回值均是 View 對象,如下:
public?View?inflate?(int?resource,?ViewGroup?root)??public?View?inflate?(XmlPullParser?parser,?ViewGroup?root)????public?View?inflate?(XmlPullParser?parser,?ViewGroup?root,?boolean?attachToRoot)????public?View?inflate?(int?resource,?ViewGroup?root,?boolean?attachToRoot)??
示意代碼:
LayoutInflater?inflater?=?(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);????View?view?=?inflater.inflate(R.layout.custom,?(ViewGroup)findViewById(R.id.test));????//EditText?editText?=?(EditText)findViewById(R.id.content);//?error??EditText?editText?=?(EditText)view.findViewById(R.id.content);??
對于上面代碼,指定了第二個參數 ViewGroup root,當然你也可以設置為 null 值。
注意:
·inflate?方法與 findViewById 方法不同;
·inflater 是用來找 res/layout?下的 xml 布局文件,并且實例化;
·findViewById() 是找具體 xml 布局文件中的具體 widget 控件(如:Button、TextView 等)。
轉載于:https://www.cnblogs.com/DonkeyTomy/articles/2595606.html
總結
以上是生活随笔為你收集整理的【转】 Android - LayoutInflate用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj 2892 Tunnel Warf
- 下一篇: javascript算法题:求任意一个1