一、ViewGroup概述
研究ViewGroup之前,我們先來看看ViewGroup的介紹:
/** * A ViewGroup is a special view that can contain other views * (called children.) The view group is the base class for layouts and views * containers. This class also defines the * android.view.ViewGroup.LayoutParams class which serves as the base * class for layouts parameters. |
一個ViewGroup是一個可以包含其他view的特別的View,ViewGroup是各個Layout和View組件的基類。(翻譯的不太好,能看懂就行了) |
Android關於ViewGroup的解釋還是比較清楚的,通過這個我們可以看出幾點:
1、ViewGroup是一個容器,而這個容器是繼承與View的。
2、ViewGroup是一個基類,並且是Layout和一些View組件的基類。
等等,不一而足,眼界有多高相信看到的就有多遠,呵呵。
二、ViewGroup的三個方法
在繼承ViewGroup時有三個重要的方法,下面我們就來看看:
1、onLayout方法
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
}
在我們繼承ViewGroup時會在除了建構函式之外提供這個方法,我們可以看到,在ViewGroup的原始碼中方法是這樣定義的,也就是父類沒有提供方法的內容,需要我們自己實現。
當View要為所有子物件分配大小和位置時,調用此方法
2、addView方法
public void addView(View child) {
addView(child, -1);
}
這個方法是用來想View容器中添加組件用的。我們可以使用這個方法想這個ViewGroup中添加組件。
3、getChildAt方法
public View getChildAt(int index) {
try {
return mChildren[index];
} catch (IndexOutOfBoundsException ex) {
return null;
}
}
這個方法用來返回指定位置的View。
注意:ViewGroup中的View是從0開始計數的。
可以說我們自訂ViewGroup時這三個方法是至關重要的,下面我們就來看看自訂ViewGroup使用。
三、一個小Demo
我們建立一個叫AndroidViewGroup的工程,Activity起名為MainActivity。在寫一個繼承於ViewGroup的類,名叫HelloViewGroup。
-->HelloViewGroup類
public class HelloViewGroup extends ViewGroup {
public HelloViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public HelloViewGroup(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
}
}
-->MainActivity類
public class MainActivity extends Activity {
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new HelloViewGroup(this));
}
}
這時你可以運行一下,發現螢幕除了狀態列了那個Label是一片黑,呵呵。下面我們來修改代碼,讓自己的ViewGroup火起來。
我們建立一個名叫myAddView的方法,這個方法用來向ViewGroup中添加組件:
/**
* 添加View的方法
* */
public void myAddView(){
ImageView mIcon = new ImageView(mContext);
mIcon.setImageResource(R.drawable.haha);
addView(mIcon);
}
然後我們修改onLayout方法:
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
View v = getChildAt(0);
v.layout(l, t, r, b);
}
然後我們看看運行效果: