天天看點

Android開發過程中的視圖組詳解

Android在螢幕中控件的組織上,可以将各個視圖(控件)組成一個視圖組(ViewGroup),視圖組是一個包含了其他視圖的視圖。

Android開發過程中的視圖組詳解

▲圖書封面

  1.視圖組(ViewGroup抽象類)

  android.view包中ViewGroup類繼承了View,是以它本身也具有View的特性。ViewGroup主要的功能在于它可以包含其他控件,作為其他控件的容器。

  ViewGroup實作了android.view包中的ViewParent接口,這個類表示一個可以作為其他的View的容器的職責。

  ViewGroup也實作了android.view包中的ViewManager接口,是以包含ViewManager中的以下幾個方法:

  public abstract void addView(View view, ViewGroup.LayoutParams params)

  public abstract void removeView(View view)

  public abstract void updateViewLayout(View view, ViewGroup.LayoutParams params)

  addView()以View作為參數,用于将這個View增加為目前視圖組的“孩子”;removeView()用于将一個View從視圖組中移除;updateViewLayout()用于更新某個View的布局。

  ViewGroup.OnHierarchyChangeListener是一個接口,用于監聽ViewGroup中的View的層次變化。這個接口中包含了兩個監聽方法:

  public abstract void onChildViewAdded (View parent, View child)

  public abstract void onChildViewRemoved (View parent, View child)

  實作一個OnHierarchyChangeListener接口後,這兩個方法可以監聽包括ViewGroup(包括其繼承者)之中的增加和删除孩子的情況。通過ViewGroup的setOnHierarchyChangeListener()方法可以将其設定給一個ViewGroup。

  ViewGroup是一個抽象類,其中包含了以下的一個抽象方法:

  protected abstract void onLayout (boolean changed, int l, int t, int r, int b)

  ViewGroup中的onLayout()方法将在ViewGroup為它的孩子們配置設定尺寸和位置的時候被調用,在這個類的實作中,需要調用每一個控件的布局方法為其布局。

  提示:onLayout()在View中是一個public的方法,在ViewGroup為protected類型,并且為abstract,由于這個方法在ViewGroup中沒有實作,是以ViewGroup本身不可以直接使用。

  2.Android的螢幕元素體系

  Android UI程式的螢幕體系結構的組織遵循以下原則:

  一個螢幕可以包含一個視圖;

  視圖組本身也是一個視圖;

  視圖組可以包含若幹個視圖。

  Android視圖和視圖組的關系如圖3-12所示。

  圖3-12中左右兩圖表示的一個螢幕中View組織的結構,左圖是各個視圖組和控件在一個螢幕之中的示意圖;右圖為視圖組的層次結構圖(View Hierarchy),這也是Android中一種常用的表示螢幕中布局的方式。

  如圖3-12所示,外部最大的框表示整個螢幕,其中包含一個視圖組ViewGroup0,ViewGroup0包含三個子視圖,即View1、ViewGroup1、ViewGroup2。ViewGroup1本身也是視圖組,包含了View2和View3;ViewGroup2本身也是視圖組,包含了View4、ViewGroup3和ViewGroup4;ViewGroup4本身也是視圖組,包含了View5和View6。

Android開發過程中的視圖組詳解

▲圖3-12 視圖和視圖組的關系(上:螢幕示意圖;下:View的層次結構圖)

  根據以上的原則,當螢幕需要包含多個視圖時,必須組織在一個視圖組中。由于視圖組本身也是一個視圖,是以視圖組還可以包含視圖組。

  一個主要的限制是:在沒有視圖組的情況下,兩個以上的視圖(也包括視圖組)是不能夠并列的。例如,在布局檔案中,類似下面的寫法是不可以的。

<?xml version="1.0" encoding="utf-8"?>

    <Button android:id="@+id/button"/>

    <EditText android:id="@+id/edit"/>

3.ViewGroup的繼承結構

  ViewGroup是所有視圖組的基類,它本身是一個不能直接使用的抽象類。在程式中使用的主要是ViewGroup的繼承者。

  ViewGroup的繼承者大部分在android.widget包中,其直接繼承者包括:AdapterView、AbsoluteLayout、FrameLayout、LinearLayout、RelativeLayout。這些繼承者各自又具有一些繼承者。

  ViewGroup繼承者的體系結構如圖3-13所示。

  圖3-13中所示的ViewGroup繼承者都是可以作為容器使用的。這些繼承者可以為它們的孩子們提供不同的布局方法,用以确定孩子們互相之間的位置和尺寸關系。

  這些繼承者又具有一些繼承者,有些繼承者是不作為容器使用的,僅僅是像一個普通控件一樣使用。

Android開發過程中的視圖組詳解

▲圖3-13 視圖組的繼承結構

  4.布局參數類

  在Android中每個控件在布局檔案中能使用的XML屬性其實有三類:

  其自己的XML屬性;

  其祖先類的XML屬性;

  其容器的布局參數。

  其中,布局參數是包含這個控件的容器(一個ViewGroup的繼承者)所提供的參數。在Android中,每一個ViewGroup的繼承者都有一個相對應的名稱為{XXX}.LayoutParams的靜态子類,表示這個ViewGroup的孩子們中可以使用的布局參數。

  這些布局參數類的基類為ViewGroup.LayoutParams,這是一個ViewGroup的靜态子類,表示ViewGroup的子對象中可以使用參數。

  ViewGroup.LayoutParams包含有兩個重要的XML屬性:android:layout_width和android:layout_height,它們表示布局對象的寬和高。除了使用實際的尺寸數值外,還有如下兩個常用的選項。

  “match_parent”或者“fill_parent”:表示能比對父視圖的最大尺寸;

  “wrap_content”:表示僅包裹孩子的最小尺寸。

  ViewGroup.MarginLayoutParams是ViewGroup.LayoutParams的一個繼承者,主要用于定義和邊緣的空白,它具有android:layout_marginTop,android:layout_marginLeft,android:layout_marginBottom,android:layout_marginRight幾個XML屬性,表示四個方向的邊緣空白。

  在ViewGroup的繼承者中,都具有一個名稱為.LayoutParams的靜态子類,這些子類繼承關系和ViewGroup子類的繼承關系具有相似性。布局參數LayoutParams使用方式如圖3-14所示。

Android開發過程中的視圖組詳解

▲圖3-14 視圖組布局參數的結構

  從圖3-14中可見,LinearLayout的布局參數LinearLayout.LayoutParams可以被這個布局的孩子們使用,RelativeLayout的布局參數RelativeLayout.LayoutParams可以被這個布局的孩子們使用。但是這裡“孩子”的含義,隻包括這個容器直接的孩子。例如,圖3-14中LinearLayout的孩子有一個是RelativeLayout,RelativeLayout的孩子中能使用的參數就不包括線性布局的參數LinearLayout.LayoutParams。

  提示:由于LayoutParams也具有繼承關系,是以LinearLayout的孩子們除了可以使用LinearLayout.LayoutParams自己的XML屬性,還可以使用其祖先類ViewGroup.LayoutParams的XML屬性。

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/wws5201985/787672,如需轉載請自行聯系原作者

繼續閱讀