官术网_书友最值得收藏!

第2章UI程序的結構

對于一個GUI系統而言,首先是由應用程序來控制屏幕中內容的外觀和行為。這些內容在不同系統的GUI開發中是不相同的,但是也具有相通性。Android系統在這方面,包含了基本的控件控制和響應、設備事件響應、窗口間跳轉、對話框、菜單、標題欄、樣式等內容,大部分是GUI相通的方面。

2.1 Android中的界面組成

屏幕是簡化的窗口,在Android中,常常使用的就是這種簡單的“窗口”。屏幕和屏幕中的內容是Android中UI構建的主要內容。這兩個方面包括:

屏幕:活動(android.app.Activity);

屏幕中的內容:視圖(android.view.View)。

Android中屏幕及其中內容的程序結構如圖2-1所示。

圖2-1 Android中屏幕及其中內容的程序結構

如圖2-1所示,android.app包中的Activity和android.view包中的View分別用于表示一個屏幕和一個視圖的基類。

Android用戶界面的基本構建方法分成以下幾個步驟:

繼承默認Activity實現自己的屏幕;

使用View的繼承者作為屏幕中的內容;

響應屏幕及其內容中的事件。

2.1.1 屏幕(活動Activity)

android.app.Activity類是Android中的活動,是Android四種組件中用來表示UI方面的組件。一個Activity中最主要的內容就是一個視圖(View),此外,這個類還包含了標題欄、菜單、對話框附屬功能。

活動的生命周期如圖2-2所示。

圖2-2 活動的生命周期

在應用程序中實現自己的活動的時候,通常需要繼承一個Activity類,并主要實現Activity中的以下幾個protected的方法:

        protected void onCreate (Bundle savedInstanceState)   // 創建時調用
        protected void onStart ()                             // 開始時調用
        protected void onResume ()                            // 恢復時調用
        protected void onPause ()                             // 停止時調用
        protected void onStop ()                              // 完全停止時調用
        protected void onRestart ()                           // 重新開始時調用
        protected void onDestroy ()                           // 銷毀時調用

這些以on為開頭的方法用于指定一個活動的狀態機轉換時刻的行為,將在一個活動生命周期中運行的不同階段被調用。

在一個Activity中,提供了以下一些接口來設置其中的內容:

        public void  setContentView(int layoutResID)      // 以布局文件的方式來設置
        public void  setContentView(View view)            // 以視圖類的方式來設置
        public void  setContentView(View view, ViewGroup.LayoutParams params)

setContentView()用于將一個視圖(View)設置到活動中,通常在所實現Activity的onCreate()階段被調用。

2.1.2 屏幕中的內容(視圖View)

android.view.View表示可見的視圖內容,它表現為界面上的可視內容,也可以接收事件。在程序中具體使用的類一般是View的繼承者。各種View的繼承者可以在布局文件中被描述。

View的主要標識是它的id,查找子View的方法。

        public final View findViewById(int id)

View的事件主要由其中的監聽者(Listener)來獲得,在View類中具有setOn{XXX}Listener()系列方法,內容如下所示:

        public void  setOnClickListener(View.OnClickListener l);
        public void  setOnLongClickListener(View.OnLongClickListener l);
        public void  setOnFocusChangeListener(View.OnFocusChangeListener l);
        public void  setOnKeyListener(View.OnKeyListener l);
        public void  setOnTouchListener(View.OnTouchListener l);
        public void  setOnCreateContextMenuListener(View.OnCreateContextMenuListener l)

這些方法的參數分別為android.view包中的幾個接口,如表2-1所示。

表2-1 事件處理接口

這些接口通常需要被用戶程序實現。需要實現的方法中,均以Vi e w為第一個參數,當這些方法被調用的時候,傳入的第一個參數通常就是發生事件的Vi e w。

2.1.3 二者的結合

View及其繼承者通常可以設置到Activity中,作為其中的內容來使用。設置的方法通常是使用Activity的setContentView()方法。

例如使用如下的方法將一個布局文件設置到活動當中。

        setContentView(R.layout.mylayout);

布局文件可以轉化成View類。這是需要使用的是android.view包中的LayoutInflater類。此時主要使用類中的以下幾個方法:

        public View inflate (int resource, ViewGroup root)
        public View inflate (int resource, ViewGroup root, boolean attachToRoot)
        public View inflate (XmlPullParser parser, ViewGroup root)
        public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)

LayoutInflater功能就是根據布局文件的id或者XML文件,將其轉化為一個View類型的內容。

在一個活動中進行如下的調用,將布局文件設置到其中:

        LayoutInflater factory = LayoutInflater.from(this);
        final View mylayout = (View )factory.inflate(R.layout.mylayout, null);
        setContentView(mylayout);

這種實現方式等價于上述直接將布局文件設置到Activity中的方式,但是兩個setContentView()的參數不同,前者使用的是整數參數,表示布局文件的id,后者使用的是一個View類型。所謂XML格式的布局文件,經過解析之后的結果實際上是一個對多層次組成的Vi e w。

提示:Activity中的setContentView()一般設置布局文件即可,沒有必要拆成解析和設置兩個步驟。在需要View類型的參數時,LayoutInflater可完成布局文件到View的轉換。

主站蜘蛛池模板: 广元市| 栾城县| 邵阳市| 广平县| 阳信县| 宾阳县| 宁明县| 边坝县| 石城县| 长沙县| 长垣县| 甘南县| 集安市| 锡林郭勒盟| 栖霞市| 东阳市| 比如县| 凤冈县| 茌平县| 东港市| 英吉沙县| 会泽县| 商丘市| 修水县| 满洲里市| 明水县| 建水县| 临桂县| 嘉峪关市| 静安区| 彭州市| 若羌县| 囊谦县| 扶余县| 揭东县| 焉耆| 探索| 平塘县| 封开县| 梨树县| 祁东县|