以下是今日份的控制元件清單:
- WebView 網路檢視
- Dialog 對話方塊
- Notification 通知
- Meau 選單
1.WebView 網路檢視
當一個應用程式想展示一個網頁時,可以怎麼做呢?自己去做一個瀏覽器是完全沒有必要的,一種方法是呼叫系統瀏覽器或第三方瀏覽器載入,需要用到Activity篇學過的信使Intent類。Intent不僅可以啟動程式內部的活動,也可以啟動其他程式的活動,所以可以呼叫其他瀏覽器去幫忙去開啟一個網站。具體程式碼如下:
這裡首先指定該Intent的action是Intent.ACTION_VIEW,這是一個Android系統內建的動作,其常量值為android.intent.action.VIEW。然後通過Uri.parse()方法,將一個網址字串解析成一個Uri物件,再呼叫Intent的setData()方法將這個Uri物件傳遞進去,最後啟動活動。執行之後:
還有一種方法就是使用系統提供的WebView控制元件,藉助它可以在應用程式裡嵌入一個瀏覽器,就能載入顯示網頁了。如何做到的呢?一起來學習一下,先在佈局裡放入WebView並鋪滿全屏:
之後在MainActivity裡獲取這個WebView例項並做一系列的設定。用WebView的 loadUrl() 方法可直接傳入網址;然後呼叫它的getSettings()方法去設定一些瀏覽器的屬性,這裡只是用setJavascriptEnable(true)讓WebView支援Javascript指令碼;接下來需要處理頁面導航,它的作用是在處理一個WebView中的頁面連結時,覆蓋系統用預設的瀏覽器開啟和載入目標URL的這一行為,而使之能在WebView中開啟。具體程式碼見下:
為了給使用者一個良好的體驗,在WebView載入網頁的過程中加一個ProgressDialog。實現方法是呼叫它的 setWebChromeClient() 方法並傳入一個WebChromeClient例項,而需要重寫的onProgressChanged()方法里正好返回當前進度資料newProgress,利用它就可以去做一個實時顯示載入進度的ProgressDialog了。上篇學過了ProgressDialog下面這些程式碼肯定非常熟悉了:
最後一定要在配置檔案獲取網路許可權。不知你是否發現,在前一種方法呼叫系統自帶的瀏覽器或第三方瀏覽器是不需要設定網路許可權的,這點要注意。
執行一下程式看看效果:
2.Dialog 對話方塊
對話方塊是在當前介面彈出的一個小視窗,可用於顯示重要的提示資訊並讓使用者確認資訊,比如上一篇講過的DataPickerDialog和TimePickerDialog,也可顯示某種狀態,比如ProgressDialog。一般情況下需要使用者與之互動然後返回到原活動介面。從之前接觸過的Dialog會發現,它需要我們在程式碼中直接建立然後show()出來。而不同於學過的Dialog,今天要學習的下圖所展示的這一系列Dialog都是用Builder建立得到的,掌握一個其他就不在話下,在佈局中準備好五個按鈕一起來學習吧。
對五個按鈕都註冊監聽事件,每個對話方塊一開始都要例項化一個AlertDialog.Builder物件,然後在它身上set各種屬性,有關圖示、標題和內容等設計在之前的學習都有涉及,接下來主要學習每個Dialog獨特的按鈕。一切都設set好之後,用Builder 的create() 方法就能得到一個Dialog,最後一定要把對話方塊 show() 出來。下面分別學習每個Dialog不同的地方:
(1)確認對話方塊
這裡做一個確認是否退出應用的Dialog,用 setPositiveButton() 和 setNegativeButton() 方法新增確定和取消按鈕,都用到 DialogInterface下的OnClickListener監聽器,點選確認就finish()退出應用,否則列印一段Toast。
效果如下:
(2)單選對話方塊
用 setSingleChoiceItems() 為單選對話方塊設定展示的資料、初始選中項(從0計算)以及監聽選項是否被點選的 OnClickListener ,上述一一對應所需的三個引數。
效果如下:
(3)多選對話方塊
多選對話方塊和單選對話方塊就非常相似了,不同的是用 setMultiChoiceItems() 和 OnMultiChoiceClickListener 。
(4)列表對話方塊
列表對話方塊用 setItems() 提供資料來源和監聽器 OnClickListener 。
效果如下:
(5)自定義對話方塊
既然是自定義樣式,不妨自定義佈局裡有一張圖片和一段文字吧!如下圖:
在程式碼裡首先利用LayoutInflater類將剛剛自定義的佈局動態載入到當前佈局得到一個View,再把這個View用Builder的 setView() 傳入到對話方塊佈局裡就可以了。
效果如圖:
3.Notification 通知
Notification是顯示在手機狀態列的訊息,在手機最頂端。將Notification放在控制元件篇因為它的建立方法和上面的Dialog有異曲同工之妙,也要利用Builder建立得到,所以索性給一點篇幅來學習如何傳送和取消一個通知 。下圖是這個小demo的佈局,有兩個按鈕一個傳送一個取消:
首先來看一個通知包含哪些內容:圖示(SmallIcon)、標題(ContextTitle)、內容(ContextText)、時間(When)還有點選後的響應。那麼下面就例項化一個NotificationCompat.Builder然後set這些屬性吧!
下圖紅框內就是構造一個Notification的過程。除了上面的幾個屬性,為了更好的告知使用者通知到來還可以設定手機做一些效果,比如震動、有提示聲音還有LED燈亮起。這裡給值DEFAULT_ALL表示以上三個效果都設定。
還有一個關鍵,如何實現點選響應。這需要用到PendingIntent類,它看起來就和Intent有些相似,它們都是可指明一個意圖並執行一些任務,只不過前者不是立即去做,還是在合適的時間才執行。這裡我們想讓這個通知跳轉到Dialog那個活動介面,所以呼叫 PendingIntent.getActivity() 並提供(提供上下文、請求碼、實現頁面跳轉的Intent、被訪問碼)四個引數,就會得到一個PendingIntent例項,再傳入Builder的 setContentIntent() 裡,跳轉就可以實現了。最後用Builder的 build() 就能得到一個Notification了。
但還沒結束,Notification自己並不能去傳送,需要用由系統提供的管理類NotificationManager去完成傳送和取消通知的事情,它有兩個方法,傳送通知notify(被髮送通知的id,通知物件)和取消傳送cancel(被取消傳送的通知id)。獲取一個NotificationManager物件方法見下圖:
當使用者點選通知頁面跳轉後,就可以將系統狀態列上的通知取消了。在跳轉後的活動裡同樣呼叫NotificationManager的cancel()方法就可以了。到此整個需求就實現了。
最後一定注意手機震動需要許可權。
執行程式,下圖展示了一個Notification從發出到被點選到取消的整個過程:
4.Meau 選單
選單是許多應用程式不可或缺的一部分,這裡主要介紹下面三種選單。
1) 選項選單 OptionsMenu:android中最常規的選單,每個Activity只有一個選項選單。 2) 子選單SubMenu:android中點選子選單將彈出懸浮視窗顯示子選單項,用於把功能相近的選單分組顯示。 3) 上下文選單ContextMenu:android中長按檢視控制元件後出現的選單,每個View都可有一個上下文選單,一般常用於ListView和GridView。
(1)選單的建立 建立一張選單有兩種方法,第一種通過載入xml檔案的選單項。但是選單的佈局檔案並不是在res->layout資料夾下,而要在res下新建名為menu的資料夾,這裡才是選單xml檔案的容身之地。詳細步驟見圖:
之後就可以根據需求在佈局檔案裡新增選單項Item,並指定每個Item的id和title。三種選單的佈局和樣式效果如下圖:
有了佈局,就可以在需要選單的Activity裡重寫方法 onCreate某某某() 並加入一行程式碼 getMenuInflater().inflate(需要新增的選單佈局,menu) 就可以了。對應關係是:新增選項選單或子選單就重寫 onCreateOptionsMenu() 方法,新增上下文選單就重寫 onCreateContextMenu() 方法。
例如新增一個ContextMenu:
第二種方法是直接在被重寫的方法裡用程式碼動態新增,方法是 menu.add() 並提供四個引數(groupId,itemId,order,title), 其中itemId和title對應了xml中Item的id和title,groupId用來分組的Id,order是選單項用來排序的。menu還可以set選單其他屬性,如圖示、標題,在後面程式碼中有展示。
三種選單兩種新增方式的程式碼如下圖所示:
這裡強調一點,因為ContextMenu對應的是每個View,這裡以ListView為例,所以一定要給ListView註冊上ContextMenu。程式碼見下:
(2)選單項的監聽
當然每個選單項可以設定點選響應事件,事件會返回引數選單項item,再利用 item.getGroupId() 、 item.getItemId() 就能判斷被點選選單項並設定相應的動作了。
例如在SubMenu設定點選事件方法:
點選效果:
下表展示三種選單各自對應方法。
至此高階控制元件篇就告一段落了,Android還提供很多控制元件,我們也可以按照自己的需求自定義控制元件,這些內容在將來學習中繼續慢慢探索吧!
> 下一篇內容:碎片Fragment