1. 程式人生 > 實用技巧 >Android中的控制元件

Android中的控制元件

Android中的控制元件

1.控制元件類的繼承結構

android.view.View類(檢視類)呈現了最基本的UI構造塊。一個檢視佔據螢幕上的一個方形區域,並且負責繪製和事件處理。

Android中控制元件類的擴充套件結構如圖3-1所示。

View有眾多的擴充套件者,它們大部分是在android.widget包中,這些繼承者實際上就是Android系統中的“控制元件”。View實際上就是各個控制元件的基類,建立互動式的圖形使用者介面的基礎。

View的直接繼承者包括文字檢視(TextView)、影象檢視(ImageView)、進度條(ProgressBar)等。它們各自又有眾多的繼承者。每個控制元件除了繼承父類功能之外,一般還具有自己的公有方法、保護方法、

XML屬性等。

Android中使用各種控制元件的一般情況是在佈局檔案中可以實現UI的外觀,然後在Java檔案中實現對各種控制元件的控制動作。控制元件類的名稱也是它們在佈局檔案XML中使用的標籤名稱。

2.控制元件通用行為和屬性

ViewAndroid中所有控制元件類的基類,因此View中一些內容是所有控制元件類都具有的通用行為和屬性。

提示:由於Java語言不支援多重繼承,因此Android控制元件不可能以基本功能的“排列組合”的方式實現。在這種情況下,為了實現功能的複用,基類的功能往往做得較強,作為控制元件的祖先類,View所實現的功能也是最多的。

控制元件類經常在佈局檔案中使用,因此其可以使用

XML屬性(XMLAttributes),和Java程式碼經常具有對應關係。

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

表示控制元件的標識,通常需要在佈局檔案中指定這個屬性。View中與控制元件標識相關的幾個方法如下所示:

public int getId() // 獲得控制元件的idint型別)

public void setId(int id) // 設定控制元件的idint型別)

public Object getTag() // 獲得控制元件的tagObject型別)

public void setTag(Object tag) // 設定控制元件的tagObject型別)

對於一個控制元件,也就是View的繼承者,整數型別id是其主要的標識。其中,getId()可以獲得控制元件的id,而setId()可以將一個整數設定為控制元件的id,但是這個方法並不常用。Viewid通常可以在佈局檔案中獲得。

Object型別的標識tag是控制元件的一個擴充套件標識,由於使用了Object型別,它可以接受大部分的Java型別。

在一個View中根據id或者tag查詢其孩子的方法如下所示:

public final View findViewById(int id)

public final View findViewWithTag(Object tag)

findViewById()findViewWithTag()的目的是返回這個View樹中idtag為某個數值的View的控制代碼。View樹的含義是View及其所有的孩子。

值得注意的是,id不是控制元件的唯一標識,例如佈局檔案中id是可以重複的,在這種重複的情況下,findViewById()的結果不能確保找到唯一的控制元件。

提示:作為控制元件的標識的idtag可以配合使用:當id有重複的時候,可以通過給控制元件設定不同的tag,對其進行區分。

可見性的問題,android:visibility在佈局檔案中有三個數值:visible(可見,預設),invisible(不可見),gone(去除)。在Java程式碼中,setVisibility()能使用的列舉值與其對應,它們是:View.VISIBLE0x0),View.INVISIBLE0x4),View.GONE0x8)。

參考示例程式:VisibilityApiDemo=>Views

原始碼:com/example/android/apis/view/ visibility_1.java

佈局檔案:visibility_1.xml

Visibility程式的執行效果如圖3-2所示。

對於文字為View B的文字框,分別使用了visibleinvisiblegone設定。invisiblegone的區別在於invisible只是不可見,但是依然佔位,gone表示將控制元件去除,顯示的效果就像沒有這個控制元件存在。

View形態相關的幾個方法如下所示:

public void invalidate () // 使無效重新繪製

public void requestLayout () // 申請重新佈局

public final boolean requestFocus () // 申請聚焦

這幾個方法都和View的顯示形態有關invalidate()方法的功能是使得無效,用於重新繪製當前的ViewrequestLayout()用於更新View也就是由當前View的大小位置變化更新與其相關的ViewrequestFocus()用於申請當前的聚焦。

查詢聚焦的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:nextFocusUpandroid:nextFocusDown分別是上下按鍵的時候,下一個聚焦的控制元件的id

——本段文位元組選自《Android經典應用程式開發》

圖書詳細資訊:http://bvbroadview.blog.51cto.com/addblog.php

轉載於:https://blog.51cto.com/bvbroadview/786816