深入理解LayoutInflater

鴨脖發表於2012-07-15

總是見到LayoutInflater,那麼這個東西是幹什麼的呢?以前沒注意,直到今天突然遇到一個問題:

我要用到一個View,就比如說一個設計好的對話方塊,我要經常用,而且介面的佈局是固定的。那麼如果我在建立的時候用程式碼來實現佈局的話,可以是可以,但是是多麼的麻煩啊!於是我想到,能不能直接在xml佈局檔案中先佈局好,然後直接把這個xml通過某種方式直接放到這個iew上呢?


正在我不知所錯的時候,我看到了layoutinflater,然後看到這個東西是給view打氣的,也就是把一個xml例項化成一個view。哈哈終於找到解決上述問題的方法了。那麼我們下面具體來探討一下:

首先講一下layoutinflater的獲取方法:

有三種方式:

LayoutInflater.from(this)

getLayoutInflater()

(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)

 以上三種方法都能獲得LayoutInflater


對於這個物件,我們只需要深入的探討一下他的一個方法就可以了,那就是inflate

我們主要研究是的其中的兩個


一個是inflate(int id,View parent)

這個方法是通過layout的id來膨脹那個父View。如果parent不是null的話,就返回父View,如果是null的話,就返回撐起的那個VIew




另一個是inflate(int id,View parent,boolean attach)

這個方法是和上面是差不多的,只不過這個時候還要看attach,如果是false,就返回子VIew,否則,返回這個View,你會發現子View被加到了父VIew上


private TextView tv;
private View view;
private View view2;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout3);
        /**
         * 取得整個layout
         */
        LinearLayout ll = (LinearLayout)findViewById(R.id.l3);
        LayoutInflater inflater = LayoutInflater.from(this);
        //LayoutInflater inflater2 = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        
        view = inflater.inflate(R.layout.layout4,ll,false);
        view2 = inflater.inflate(R.layout.layout2,ll,false);
        ll.addView(view);
        ll.addView(view2);
        
        Button btn = new Button(this);
        btn.setText("gone");
        ll.addView(btn);
        btn.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {
// TODO Auto-generated method stub
MainActivity.this.view.setVisibility(View.GONE);
MainActivity.this.view.setBackgroundColor(Color.RED);
}
});
        
    }