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