Inflate()作用就是將xml定義的一個布局找出來,但僅僅是找出來而且隱藏的,沒有找到的同時並顯示功能。最近做的一個項目就是這一點讓我迷茫了好幾天。
android上還有一個與Inflate()類似功能的方法叫findViewById(),二者有時均可使用,但也有區別
區別在於:
如果你的Activity裡用到別的layout,比如對話方塊layout,你還要設定這個layout上的其他組件的內容,你就必須用inflate()方法先將對話方塊的layout找出來,然後再用findViewById()找到它上面的其它組件。例如:
[html]
view plaincopyprint?
- View view1=View.inflate(this,R.layout.dialog_layout,null);
-
- TextViewdialogTV=(TextView)view1.findViewById(R.id.dialog_tv);
-
- dialogTV.setText("abcd");
View view1=View.inflate(this,R.layout.dialog_layout,null); TextViewdialogTV=(TextView)view1.findViewById(R.id.dialog_tv); dialogTV.setText("abcd");
註:R.id.dialog_tv是在對話方塊layout上的組件,而這時若直接用this.findViewById(R.id.dialog_tv)肯定會報錯。
[html]
view plaincopyprint?
- View viewStub = ((ViewStub) findViewById(R.id.stubView)).inflate();
View viewStub = ((ViewStub) findViewById(R.id.stubView)).inflate();
Inflate()或可理解為“隱性膨脹”,隱性擺放在view裡,inflate()前只是獲得控制項,但沒有大小沒有在View裡佔據空間,inflate()後有一定大小,只是出於隱藏狀態.
LayoutInflater和inflate的用法
在這裡用Tabhost的例子來說明:
[java]
view plaincopyprint?
- package cn.csdn.activity;
-
- import android.app.TabActivity;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.widget.TabHost;
-
- public class TabHostActivity extends TabActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
-
- super.onCreate(savedInstanceState);
- TabHost tabhost = this.getTabHost();
-
- /**
- * LayoutInflater這個類的作用類似於findViewById(),
- * 不同點:
- * LayoutInflater是用來找layout下xml布局檔案的,而且它會執行個體化
- * findViewById()是找具體xml布局檔案下的具體widget控制項,比如:Button按鈕
- *
- *
- *
- * inflate就相當於將一個xml中定義的布局找出來.
- * 因為如果在一個Activity檔案裡直接用findViewById()這個方法的話,
- * 那麼它所對應的是setConentView()中調用的那個layout裡的組件.
- * 因此如果在同樣的Activity裡用到別的layout的話,
- * 而且你還要設定這個layout裡的組件(比如:ImageView,TextView)上的內容,
- * 那麼你就必須用inflate()先將這個layout找出來, 然後再用這個layout對象去找到它上面的組件
- * 然後進行一系列的操作
- *
- * inflate()方法中參數:
- * 1.想要用的布局檔案的id
- * 2.持有選項卡的內容,擷取FrameLayout
- * 3.true:將此處解析的xml檔案做為根視圖View
- */
- LayoutInflater.from(this).inflate(R.layout.tabhost_layout,
- tabhost.getTabContentView(), true);
-
-
- /**在這裡添加的時候:
- * 1.必須指定 tab 的內容,必須為 id, 即:setContent(R.id.text)
- * 2.必須設定tab 上的文字或圖片 , 即:setIndicator("已接電話")
- * 3.返回一個 TabHost.TabSpec 對象,其參數用於標識一個 tab 的 tag,即:newTabSpec("tab1")
- */
- tabhost.addTab(tabhost.newTabSpec("tab1").setIndicator("已接電話")
- .setContent(R.id.text));
-
- tabhost.addTab(tabhost.newTabSpec("tab2").setIndicator("呼出電話",
- getResources().getDrawable(R.drawable.ic_launcher))
- .setContent(R.id.text));
-
- tabhost.addTab(tabhost.newTabSpec("tab3").setIndicator("未接電話")
- .setContent(R.id.text));
- }
- }
一、LayoutInflater
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()
例:View toastRoot = getLayoutInflater().inflate(R.layout.toast, null);
2. LayoutInflater localinflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
3. LayoutInflater inflater = LayoutInflater.from(context);
例:View convertView = LayoutInflater.from(mContext).inflate(R.layout.activity_contact, null);
二、inflate
通俗的說,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)肯定會報錯.