以下是今日份的控件清單:
- WebView 網(wǎng)絡(luò)視圖
- Dialog 對話框
- Notification 通知
- Meau 菜單
1.WebView 網(wǎng)絡(luò)視圖
當(dāng)一個(gè)應(yīng)用程序想展示一個(gè)網(wǎng)頁時(shí),可以怎么做呢?自己去做一個(gè)瀏覽器是完全沒有必要的弛秋,一種方法是調(diào)用系統(tǒng)瀏覽器或第三方瀏覽器加載,需要用到Activity篇學(xué)過的信使Intent類秫筏。Intent不僅可以啟動(dòng)程序內(nèi)部的活動(dòng),也可以啟動(dòng)其他程序的活動(dòng),所以可以調(diào)用其他瀏覽器去幫忙去打開一個(gè)網(wǎng)站盒让。具體代碼如下:
這里首先指定該Intent的action是Intent.ACTION_VIEW菌赖,這是一個(gè)Android系統(tǒng)內(nèi)置的動(dòng)作缭乘,其常量值為android.intent.action.VIEW。然后通過Uri.parse()方法琉用,將一個(gè)網(wǎng)址字符串解析成一個(gè)Uri對象堕绩,再調(diào)用Intent的setData()方法將這個(gè)Uri對象傳遞進(jìn)去,最后啟動(dòng)活動(dòng)邑时。運(yùn)行之后:
還有一種方法就是使用系統(tǒng)提供的WebView控件奴紧,借助它可以在應(yīng)用程序里嵌入一個(gè)瀏覽器,就能加載顯示網(wǎng)頁了晶丘。如何做到的呢黍氮?一起來學(xué)習(xí)一下,先在布局里放入WebView并鋪滿全屏:
之后在MainActivity里獲取這個(gè)WebView實(shí)例并做一系列的設(shè)置浅浮。用WebView的loadUrl()方法可直接傳入網(wǎng)址沫浆;然后調(diào)用它的getSettings()方法去設(shè)置一些瀏覽器的屬性,這里只是用setJavascriptEnable(true)讓W(xué)ebView支持Javascript腳本滚秩;接下來需要處理頁面導(dǎo)航专执,它的作用是在處理一個(gè)WebView中的頁面鏈接時(shí),覆蓋系統(tǒng)用默認(rèn)的瀏覽器打開和加載目標(biāo)URL的這一行為郁油,而使之能在WebView中打開本股。具體代碼見下:
為了給用戶一個(gè)良好的體驗(yàn),在WebView加載網(wǎng)頁的過程中加一個(gè)ProgressDialog已艰。實(shí)現(xiàn)方法是調(diào)用它的setWebChromeClient()方法并傳入一個(gè)WebChromeClient實(shí)例痊末,而需要重寫的onProgressChanged()方法里正好返回當(dāng)前進(jìn)度數(shù)據(jù)newProgress,利用它就可以去做一個(gè)實(shí)時(shí)顯示加載進(jìn)度的ProgressDialog了哩掺。上篇學(xué)過了ProgressDialog下面這些代碼肯定非常熟悉了:
最后一定要在配置文件獲取網(wǎng)絡(luò)權(quán)限凿叠。不知你是否發(fā)現(xiàn),在前一種方法調(diào)用系統(tǒng)自帶的瀏覽器或第三方瀏覽器是不需要設(shè)置網(wǎng)絡(luò)權(quán)限的,這點(diǎn)要注意盒件。
運(yùn)行一下程序看看效果:
2.Dialog 對話框
對話框是在當(dāng)前界面彈出的一個(gè)小窗口蹬碧,可用于顯示重要的提示信息并讓用戶確認(rèn)信息,比如上一篇講過的DataPickerDialog和TimePickerDialog炒刁,也可顯示某種狀態(tài)恩沽,比如ProgressDialog。一般情況下需要用戶與之交互然后返回到原活動(dòng)界面翔始。從之前接觸過的Dialog會發(fā)現(xiàn)罗心,它需要我們在代碼中直接創(chuàng)建然后show()出來。而不同于學(xué)過的Dialog城瞎,今天要學(xué)習(xí)的下圖所展示的這一系列Dialog都是用Builder建立得到的渤闷,掌握一個(gè)其他就不在話下,在布局中準(zhǔn)備好五個(gè)按鈕一起來學(xué)習(xí)吧脖镀。
對五個(gè)按鈕都注冊監(jiān)聽事件飒箭,每個(gè)對話框一開始都要實(shí)例化一個(gè)AlertDialog.Builder對象,然后在它身上set各種屬性蜒灰,有關(guān)圖標(biāo)弦蹂、標(biāo)題和內(nèi)容等設(shè)計(jì)在之前的學(xué)習(xí)都有涉及,接下來主要學(xué)習(xí)每個(gè)Dialog獨(dú)特的按鈕强窖。一切都設(shè)set好之后凸椿,用Builder的create()方法就能得到一個(gè)Dialog,最后一定要把對話框show()出來翅溺。下面分別學(xué)習(xí)每個(gè)Dialog不同的地方:
(1)確認(rèn)對話框
這里做一個(gè)確認(rèn)是否退出應(yīng)用的Dialog削饵,用setPositiveButton()和setNegativeButton()方法添加確定和取消按鈕,都用到
DialogInterface下的OnClickListener監(jiān)聽器未巫,點(diǎn)擊確認(rèn)就finish()退出應(yīng)用,否則打印一段Toast启昧。
效果如下:
(2)單選對話框
用setSingleChoiceItems()為單選對話框設(shè)置展示的數(shù)據(jù)叙凡、初始選中項(xiàng)(從0計(jì)算)以及監(jiān)聽選項(xiàng)是否被點(diǎn)擊的OnClickListener,上述一一對應(yīng)所需的三個(gè)參數(shù)密末。
效果如下:
(3)多選對話框
多選對話框和單選對話框就非常相似了握爷,不同的是用setMultiChoiceItems()和OnMultiChoiceClickListener。
(4)列表對話框
列表對話框用setItems()提供數(shù)據(jù)源和監(jiān)聽器OnClickListener严里。
效果如下:
(5)自定義對話框
既然是自定義樣式新啼,不妨自定義布局里有一張圖片和一段文本吧!如下圖:
在代碼里首先利用LayoutInflater類將剛剛自定義的布局動(dòng)態(tài)加載到當(dāng)前布局得到一個(gè)View刹碾,再把這個(gè)View用Builder的setView()傳入到對話框布局里就可以了燥撞。
效果如圖:
3.Notification 通知
Notification是顯示在手機(jī)狀態(tài)欄的消息,在手機(jī)最頂端。將Notification放在控件篇因?yàn)樗膭?chuàng)建方法和上面的Dialog有異曲同工之妙物舒,也要利用Builder建立得到色洞,所以索性給一點(diǎn)篇幅來學(xué)習(xí)如何發(fā)送和取消一個(gè)通知 。下圖是這個(gè)小demo的布局冠胯,有兩個(gè)按鈕一個(gè)發(fā)送一個(gè)取消:
首先來看一個(gè)通知包含哪些內(nèi)容:圖標(biāo)(SmallIcon)火诸、標(biāo)題(ContextTitle)、內(nèi)容(ContextText)荠察、時(shí)間(When)還有點(diǎn)擊后的響應(yīng)置蜀。那么下面就實(shí)例化一個(gè)NotificationCompat.Builder然后set這些屬性吧!
下圖紅框內(nèi)就是構(gòu)造一個(gè)Notification的過程悉盆。除了上面的幾個(gè)屬性盯荤,為了更好的告知用戶通知到來還可以設(shè)置手機(jī)做一些效果,比如震動(dòng)舀瓢、有提示聲音還有LED燈亮起廷雅。這里給值DEFAULT_ALL表示以上三個(gè)效果都設(shè)置。
還有一個(gè)關(guān)鍵京髓,如何實(shí)現(xiàn)點(diǎn)擊響應(yīng)航缀。這需要用到PendingIntent類,它看起來就和Intent有些相似堰怨,它們都是可指明一個(gè)意圖并執(zhí)行一些任務(wù)芥玉,只不過前者不是立即去做,還是在合適的時(shí)間才執(zhí)行备图。這里我們想讓這個(gè)通知跳轉(zhuǎn)到Dialog那個(gè)活動(dòng)界面灿巧,所以調(diào)用PendingIntent.getActivity()并提供(提供上下文、請求碼揽涮、實(shí)現(xiàn)頁面跳轉(zhuǎn)的Intent抠藕、被訪問碼)四個(gè)參數(shù),就會得到一個(gè)PendingIntent實(shí)例蒋困,再傳入Builder的setContentIntent()里盾似,跳轉(zhuǎn)就可以實(shí)現(xiàn)了。最后用Builder的build()就能得到一個(gè)Notification了雪标。
但還沒結(jié)束零院,Notification自己并不能去發(fā)送,需要用由系統(tǒng)提供的管理類NotificationManager去完成發(fā)送和取消通知的事情村刨,它有兩個(gè)方法告抄,發(fā)送通知notify(被發(fā)送通知的id,通知對象)和取消發(fā)送cancel(被取消發(fā)送的通知id)嵌牺。獲取一個(gè)NotificationManager對象方法見下圖:
當(dāng)用戶點(diǎn)擊通知頁面跳轉(zhuǎn)后打洼,就可以將系統(tǒng)狀態(tài)欄上的通知取消了龄糊。在跳轉(zhuǎn)后的活動(dòng)里同樣調(diào)用NotificationManager的cancel()方法就可以了。到此整個(gè)需求就實(shí)現(xiàn)了拟蜻。
最后一定注意手機(jī)震動(dòng)需要權(quán)限绎签。
運(yùn)行程序,下圖展示了一個(gè)Notification從發(fā)出到被點(diǎn)擊到取消的整個(gè)過程:
注意:安卓8.0發(fā)通知需要為通知添加渠道NotificationChannel酝锅,詳見Android 8.0 通知顯示
4.Meau 菜單
菜單是許多應(yīng)用程序不可或缺的一部分诡必,這里主要介紹下面三種菜單。
1) 選項(xiàng)菜單 OptionsMenu:android中最常規(guī)的菜單搔扁,每個(gè)Activity只有一個(gè)選項(xiàng)菜單爸舒。
2) 子菜單SubMenu:android中點(diǎn)擊子菜單將彈出懸浮窗口顯示子菜單項(xiàng),用于把功能相近的菜單分組顯示稿蹲。
3) 上下文菜單ContextMenu:android中長按視圖控件后出現(xiàn)的菜單扭勉,每個(gè)View都可有一個(gè)上下文菜單,一般常用于ListView和GridView苛聘。
(1)菜單的創(chuàng)建
創(chuàng)建一張菜單有兩種方法涂炎,第一種通過加載xml文件的菜單項(xiàng)。但是菜單的布局文件并不是在res->layout文件夾下设哗,而要在res下新建名為menu的文件夾唱捣,這里才是菜單xml文件的容身之地。詳細(xì)步驟見圖:
之后就可以根據(jù)需求在布局文件里添加菜單項(xiàng)Item网梢,并指定每個(gè)Item的id和title震缭。三種菜單的布局和樣式效果如下圖:
有了布局,就可以在需要菜單的Activity里重寫方法 onCreate某某某()并加入一行代碼getMenuInflater().inflate(需要添加的菜單布局,menu)就可以了战虏。對應(yīng)關(guān)系是:添加選項(xiàng)菜單或子菜單就重寫onCreateOptionsMenu()方法拣宰,添加上下文菜單就重寫onCreateContextMenu()方法。
例如添加一個(gè)ContextMenu:
第二種方法是直接在被重寫的方法里用代碼動(dòng)態(tài)添加烦感,方法是menu.add()并提供四個(gè)參數(shù)(groupId,itemId,order,title), 其中itemId和title對應(yīng)了xml中Item的id和title巡社,groupId用來分組的Id,order是菜單項(xiàng)用來排序的手趣。menu還可以set菜單其他屬性重贺,如圖標(biāo)、標(biāo)題回懦,在后面代碼中有展示。
三種菜單兩種添加方式的代碼如下圖所示:
這里強(qiáng)調(diào)一點(diǎn)次企,因?yàn)镃ontextMenu對應(yīng)的是每個(gè)View怯晕,這里以ListView為例,所以一定要給ListView注冊上ContextMenu缸棵。代碼見下:
(2)菜單項(xiàng)的監(jiān)聽
當(dāng)然每個(gè)菜單項(xiàng)可以設(shè)置點(diǎn)擊響應(yīng)事件舟茶,事件會返回參數(shù)菜單項(xiàng)item,再利用item.getGroupId()、item.getItemId()就能判斷被點(diǎn)擊菜單項(xiàng)并設(shè)置相應(yīng)的動(dòng)作了吧凉。
例如在SubMenu設(shè)置點(diǎn)擊事件方法:
點(diǎn)擊效果:
下表展示三種菜單各自對應(yīng)方法隧出。
至此高級控件篇就告一段落了蜡豹,Android還提供很多控件簇捍,我們也可以按照自己的需求自定義控件菲驴,這些內(nèi)容在將來學(xué)習(xí)中繼續(xù)慢慢探索吧埂伦!
> 下一篇內(nèi)容:碎片F(xiàn)ragment