Android中的控制元件
Android中的控制元件
1.控制元件類的繼承結構
android.view.View類(檢視類)呈現了最基本的UI構造塊。一個檢視佔據螢幕上的一個方形區域,並且負責繪製和事件處理。
Android中控制元件類的擴充套件結構如圖3-1所示。
View有眾多的擴充套件者,它們大部分是在android.widget包中,這些繼承者實際上就是Android系統中的“控制元件”。View實際上就是各個控制元件的基類,建立互動式的圖形使用者介面的基礎。
View的直接繼承者包括文字檢視(TextView)、影象檢視(ImageView)、進度條(ProgressBar)等。它們各自又有眾多的繼承者。每個控制元件除了繼承父類功能之外,一般還具有自己的公有方法、保護方法、
在Android中使用各種控制元件的一般情況是在佈局檔案中可以實現UI的外觀,然後在Java檔案中實現對各種控制元件的控制動作。控制元件類的名稱也是它們在佈局檔案XML中使用的標籤名稱。
2.控制元件通用行為和屬性
View是Android中所有控制元件類的基類,因此View中一些內容是所有控制元件類都具有的通用行為和屬性。
提示:由於Java語言不支援多重繼承,因此Android控制元件不可能以基本功能的“排列組合”的方式實現。在這種情況下,為了實現功能的複用,基類的功能往往做得較強,作為控制元件的祖先類,View所實現的功能也是最多的。
控制元件類經常在佈局檔案中使用,因此其可以使用
View作為各種控制元件的基類,其XML屬性所有控制元件通用,幾個重要的XML屬性如表3-1所示。
表3-1 View中幾個重要XML屬性及其對應的方法
XML屬性 |
Java中的方法 |
描 述 |
android:id |
setId(int) |
控制元件的標識 |
android:visibility |
setVisibility(int) |
控制元件的可見性 |
android:background |
setBackgroundResource(int) |
控制元件的背景 |
其中,android:id
public int getId() // 獲得控制元件的id(int型別)
public void setId(int id) // 設定控制元件的id(int型別)
public Object getTag() // 獲得控制元件的tag(Object型別)
public void setTag(Object tag) // 設定控制元件的tag(Object型別)
對於一個控制元件,也就是View的繼承者,整數型別id是其主要的標識。其中,getId()可以獲得控制元件的id,而setId()可以將一個整數設定為控制元件的id,但是這個方法並不常用。View的id通常可以在佈局檔案中獲得。
Object型別的標識tag是控制元件的一個擴充套件標識,由於使用了Object型別,它可以接受大部分的Java型別。
在一個View中根據id或者tag查詢其孩子的方法如下所示:
public final View findViewById(int id)
public final View findViewWithTag(Object tag)
findViewById()和findViewWithTag()的目的是返回這個View樹中id和tag為某個數值的View的控制代碼。View樹的含義是View及其所有的孩子。
值得注意的是,id不是控制元件的唯一標識,例如佈局檔案中id是可以重複的,在這種重複的情況下,findViewById()的結果不能確保找到唯一的控制元件。
提示:作為控制元件的標識的id和tag可以配合使用:當id有重複的時候,可以通過給控制元件設定不同的tag,對其進行區分。
可見性的問題,android:visibility在佈局檔案中有三個數值:visible(可見,預設),invisible(不可見),gone(去除)。在Java程式碼中,setVisibility()能使用的列舉值與其對應,它們是:View.VISIBLE(0x0),View.INVISIBLE(0x4),View.GONE(0x8)。
參考示例程式:Visibility(ApiDemo=>Views)
原始碼:com/example/android/apis/view/ visibility_1.java
佈局檔案:visibility_1.xml
Visibility程式的執行效果如圖3-2所示。
對於文字為View B的文字框,分別使用了visible、invisible和gone設定。invisible和gone的區別在於invisible只是不可見,但是依然佔位,gone表示將控制元件去除,顯示的效果就像沒有這個控制元件存在。
和View形態相關的幾個方法如下所示:
public void invalidate () // 使無效(重新繪製)
public void requestLayout () // 申請重新佈局
public final boolean requestFocus () // 申請聚焦
這幾個方法都和View的顯示形態有關:invalidate()方法的功能是使得無效,用於重新繪製當前的View;requestLayout()用於更新View樹,也就是由當前View的大小位置變化更新與其相關的View;requestFocus()用於申請當前的聚焦。
查詢聚焦的View的方法如下所示:
public View findFocus () // 找到聚焦的View
在佈局檔案中,如果在一個控制元件的標籤中使用<requestFocus />標籤,表示指定它在預設情況下被聚焦。當使用上、下、左、右按鍵的時候,各個控制元件有著預設的聚焦順序。其他聚焦的問題可以在佈局檔案中進一步處理,一個處理的方法如下所示:
<LinearLayout android:orientation="vertical">
<Button android:id="@+id/top" android:nextFocusUp="@+id/bottom" />
<Button android:id="@+id/bottom" android:nextFocusDown="@+id/top" />
</LinearLayout>
這裡android:nextFocusUp和android:nextFocusDown分別是上下按鍵的時候,下一個聚焦的控制元件的id。
——本段文位元組選自《Android經典應用程式開發》
圖書詳細資訊:http://bvbroadview.blog.51cto.com/addblog.php
轉載於:https://blog.51cto.com/bvbroadview/786816