Android中自訂ViewGroup

來源:互聯網
上載者:User

一、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);
    }

 

然後我們看看運行效果:

 

     

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.