學(xué)習(xí)筆記| AS入門(五) 高級控件篇(下)

以下是今日份的控件清單:

  • 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梗摇,一起剝皮案震驚了整個(gè)濱河市勺届,隨后出現(xiàn)的幾起案子斗锭,更是在濱河造成了極大的恐慌由桌,老刑警劉巖忍级,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帆谍,死亡現(xiàn)場離奇詭異,居然都是意外死亡轴咱,警方通過查閱死者的電腦和手機(jī)汛蝙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朴肺,“玉大人窖剑,你說我怎么就攤上這事∮畲欤” “怎么了苛吱?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長器瘪。 經(jīng)常有香客問我翠储,道長,這世上最難降的妖魔是什么橡疼? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任援所,我火速辦了婚禮,結(jié)果婚禮上欣除,老公的妹妹穿的比我還像新娘住拭。我一直安慰自己,他們只是感情好历帚,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布滔岳。 她就那樣靜靜地躺著,像睡著了一般挽牢。 火紅的嫁衣襯著肌膚如雪谱煤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天禽拔,我揣著相機(jī)與錄音刘离,去河邊找鬼室叉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硫惕,可吹牛的內(nèi)容都是我干的茧痕。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼恼除,長吁一口氣:“原來是場噩夢啊……” “哼踪旷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缚柳,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤埃脏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后秋忙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彩掐,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年灰追,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堵幽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弹澎,死狀恐怖朴下,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苦蒿,我是刑警寧澤殴胧,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站佩迟,受9級特大地震影響团滥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜报强,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一灸姊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秉溉,春花似錦力惯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弄跌,卻和暖如春甲喝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碟绑。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工俺猿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人格仲。 一個(gè)月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓押袍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凯肋。 傳聞我的和親對象是個(gè)殘疾皇子谊惭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361