Android之Inflate()方法用途

來源:互聯網
上載者:User

Inflate()作用就是將xml定義的一個布局找出來,但僅僅是找出來而且隱藏的,沒有找到的同時並顯示功能。最近做的一個項目就是這一點讓我迷茫了好幾天。

android上還有一個與Inflate()類似功能的方法叫findViewById(),二者有時均可使用,但也有區別

區別在於:

如果你的Activity裡用到別的layout,比如對話方塊layout,你還要設定這個layout上的其他組件的內容,你就必須用inflate()方法先將對話方塊的layout找出來,然後再用findViewById()找到它上面的其它組件。例如:

[html]
view plaincopyprint?
  1. View view1=View.inflate(this,R.layout.dialog_layout,null);  
  2.     
  3.   TextViewdialogTV=(TextView)view1.findViewById(R.id.dialog_tv);  
  4.     
  5.   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?
  1. 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?
  1. package cn.csdn.activity;  
  2.   
  3. import android.app.TabActivity;  
  4. import android.os.Bundle;  
  5. import android.view.LayoutInflater;  
  6. import android.widget.TabHost;  
  7.   
  8. public class TabHostActivity extends TabActivity {  
  9.   
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.   
  13.         super.onCreate(savedInstanceState);  
  14.         TabHost tabhost = this.getTabHost();  
  15.   
  16.         /** 
  17.          * LayoutInflater這個類的作用類似於findViewById(), 
  18.          * 不同點: 
  19.          *     LayoutInflater是用來找layout下xml布局檔案的,而且它會執行個體化 
  20.          *     findViewById()是找具體xml布局檔案下的具體widget控制項,比如:Button按鈕 
  21.          *  
  22.          *  
  23.          *  
  24.          * inflate就相當於將一個xml中定義的布局找出來.     
  25.          * 因為如果在一個Activity檔案裡直接用findViewById()這個方法的話, 
  26.          * 那麼它所對應的是setConentView()中調用的那個layout裡的組件.    
  27.          * 因此如果在同樣的Activity裡用到別的layout的話, 
  28.          *     而且你還要設定這個layout裡的組件(比如:ImageView,TextView)上的內容, 
  29.          *     那麼你就必須用inflate()先將這個layout找出來, 然後再用這個layout對象去找到它上面的組件 
  30.          *     然後進行一系列的操作 
  31.          *      
  32.          *     inflate()方法中參數: 
  33.          *       1.想要用的布局檔案的id 
  34.          *       2.持有選項卡的內容,擷取FrameLayout 
  35.          *       3.true:將此處解析的xml檔案做為根視圖View 
  36.          */  
  37.         LayoutInflater.from(this).inflate(R.layout.tabhost_layout,  
  38.                 tabhost.getTabContentView(), true);  
  39.   
  40.           
  41.         /**在這裡添加的時候: 
  42.          *       1.必須指定 tab 的內容,必須為 id, 即:setContent(R.id.text) 
  43.          *       2.必須設定tab 上的文字或圖片  , 即:setIndicator("已接電話") 
  44.          *       3.返回一個 TabHost.TabSpec 對象,其參數用於標識一個 tab 的 tag,即:newTabSpec("tab1") 
  45.         */  
  46.         tabhost.addTab(tabhost.newTabSpec("tab1").setIndicator("已接電話")  
  47.                 .setContent(R.id.text));  
  48.           
  49.         tabhost.addTab(tabhost.newTabSpec("tab2").setIndicator("呼出電話",  
  50.                 getResources().getDrawable(R.drawable.ic_launcher))  
  51.                 .setContent(R.id.text));  
  52.           
  53.         tabhost.addTab(tabhost.newTabSpec("tab3").setIndicator("未接電話")  
  54.                 .setContent(R.id.text));  
  55.     }  
  56. }  

 

一、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)肯定會報錯.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.