標籤:android style blog http color io os ar strong
前言
Toast,這個曾經也是現在正在迷倒萬千軟體開發人員尤其是android開發人員的小美女,向來不乏在各個明星應用中頻繁登場。Toast是神馬~聽說是一種多士麵包,能吃嗎?如果手機螢幕是巧克力做的,我覺得興許味道還不錯的說。言歸正傳,先來說一說Toast的應用情境,畢竟Toast哥也是見過大場面的人兒了。張三正打算拿在移動互連網上沖一個浪,突然Toast一個:“網路不給力啊,我都拿不到資料了”;李四要安裝應用到記憶卡,這時Toast一個:“你窮的連記憶卡都買不起呀,我都找不著地兒安裝了”;王五玩累遊戲要退出應用,退出時Toast一個:“別這樣嘛,你真要走了?”。所以,鑒於Toast哥已經遍布在大街小巷的種種應用中深入人心,這個Toast我們不應該好好玩轉一下嗎?想想還有點小激動呢。
但是現在有人要說了,Toast一個還不容易?直接
Toast.makeText(MainActivity.this, “Toast一下”, Toast.LENGTH_LONG).show();
不就出現了,這還有什麼好研究的嗎?那麼,我恭喜你,你掌握了Toast的最基本的用法,也具備了讀懂接下來所需的儲備知識。
那麼問題來了:我們應該掌握Toast的哪些基礎知識呢?
-----------------------------------------我是分割線(本篇部落格立足基礎,後面將會發布兩篇乾貨的Toast部落格)--------------------------------------------
普通的Toast
所謂萬丈高樓平地起,,D罩胸圍A罩起;基礎紮實了,啥都不是事兒。案例驅動,往往是最好理解滴~
某天小明菜鳥接到一個活兒,老大叫他把應用中的出意外的地方(參考網路出錯、誤操作)向使用者展示出來,但並不需要使用者回饋。小明這時信心滿滿了,就這點功能,可不就是Toast就可以完美解決的嗎。在程式中需要的地方ctrl+c and ctrl+v 下面代碼,三下五除二的就搞定了,恩,就是這樣了。
Toast.makeText(MainActivity.this, “Toast一下”, Toast.LENGTH_LONG).show();
小明雖然是菜鳥但是很好學的,不僅把代碼糊弄好了,順便也研究了一下Toast的基本用法,總結出幾條:
1、Toast.makeText()會返回Toast執行個體,我們可以先擷取Toast執行個體,再調用Show()方法顯示。
2、Toast不會佔據焦點,也不會遮擋後面的Activity導致其進入生命週期變換。
“提示使用者,Toast一下!”小明在泛黃的筆記本上記下了這句箴言。
給Toast挪挪位置
第二天小明心血來潮的測試了下軟體,發現Toast經常把位於稍微靠近底部的使用者按鈕給時不時遮蓋了一下,雖然不影響Button的事件觸發,但是心裡的那個彆扭呀。不行,給它挪挪窩先,所以小明看遍了部落格園的一些小道文章,終於有一個重大的發現,可以通過setGravity()來改變Toast的顯示位置!話不多說,代碼出爐:
Toast toast = Toast.makeText(MainActivity.this, R.string.user_defined_location, Toast.LENGTH_LONG);toast.setGravity(Gravity.CENTER_VERTICAL, 0, -50);toast.show();
終於把Toast拉到螢幕置中(Gravity.CENTER_VERTICAL),但是小明嫌中間不好,有在豎直方面往上移動了50距離,效果出來了。
這麼簡單就解決了,小明肯定不會僅僅滿足於此,所以對setGravity(gravity, xOffset, yOffset)也進行了簡單的分析:
1、gravity是輸入Toast需要顯示的位置,例如CENTER_VERTICAL(垂直置中)、CENTER_HORIZONTAL(水平置中)、TOP(頂部)等等。
2、xOffset則是決定Toast在水平方向(x軸)的位移量,位移量單位為,大於0向右位移,小於0向左位移,等於0由於小明太懶所以沒解釋。
3、yOffset決定Toast在垂直方向(y軸)的位移量,大於0向下位移,小於0向上位移,末了小明加了個PS:想設大值也沒關係,反正Toast不會跑出螢幕。
在Toast加上個Logo
小明用Toast用著用著就覺得老單調了,就像老婆一樣看久了就覺得沒追求她的時候漂亮了一樣(偶除外!)。突然覺得能在Toast的時候加個Logo表徵圖有種高大上的感覺,那麼問題來了:小明要怎麼做才能實現這種效果呢?度娘永遠是一個好老師,小明發現了這麼一段代碼:
Toast toast = Toast.makeText(MainActivity.this, R.string.user_defined_picture, Toast.LENGTH_LONG);LinearLayout toastView = (LinearLayout) toast.getView();//擷取Toast的LinearLayout,注意需要是線性布局ImageView image = new ImageView(MainActivity.this);image.setImageResource(R.drawable.ic_launcher);//產生一個現實Logo的ImageViewtoastView.addView(image);//將ImageView載入到LinearLayout上面toast.show();
小明happy的將代碼copy進工程裡面,裡面就出現了效果:
呼呼(~ o ~)~zZ。。。小明注意到了注釋裡面強調為用線性布局,為啥呢?鑒於這篇部落客要講的是基礎,所以不在此分析源碼,只強調一下Toast布局在源碼中的布局是採用LinearLayout,所以大家getView的時候自覺點轉成線性布局就行了。
完全定製一個Toast
小明在搗鼓Toast加Logo的過程中,發現了另外一個setView()方法。額,既然getView()是擷取Toast的布局,按小明攻城獅的思維來說,setView()毫無疑問是設定Toast的布局,“如果不是偶就直播吃翔!”小明躊躇滿志的說,既然發現了這個神奇的東東,小明覺得加個Logo不如來個完全定製。人生少不了幾次說走就走的旅行,碼代碼當然也不能少幾次說幹就乾的激情。
Toast完全定製代碼:
Toast toast = Toast.makeText(MainActivity.this, R.string.user_defined_picture, Toast.LENGTH_LONG);LinearLayout toastView = (LinearLayout) LayoutInflater.from(MainActivity.this).inflate(R.layout.toast_view, null);toast.setView(toastView);toast.show();
xml布局檔案很簡單:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/user_defined_all" /> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
成果如下:
天佑小明呀,逃脫了直播的命運;完全在小明的預料中,一個暫時的自訂Toast就出現的眼前。
鏡頭轉到小明面前,一臉冷笑:“呵呵~”。
非同步運行Toast
過幾天后,小明遇到一個大難題了,需要在點擊的某個時間後顯示Toast,也就是要非同步執行Toast.show()。小明先是new 了一個Thread子線程,到規定的時間後就調用Toast.show()。但是但是,Logcat給出了一大堆紅叉叉報錯!!!!這可愁壞小明了,既然用開啟子線程的辦法Toast會報錯,那麼問題來了:怎樣才可以在按需完成任務呢?
方法一:既然在子線程中報錯,那麼我們就借用Handler來在訊息佇列中執行。
handler.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, R.string.other_thread, Toast.LENGTH_LONG).show();
}});
PS:該Runnable是在主線程中執行run的,具體請參加Google文檔。所以不會出現報錯。
方法二:我們可以強行在子線程中執行,只需要擷取Looper。
new Thread(){ @Override public void run(){ Looper.prepare(); Toast.makeText(MainActivity.this, R.string.other_thread, Toast.LENGTH_LONG).show(); Looper.loop(); Log.i("text", "注意:Looper.loop()後面的代碼不會被執行");//LogCat無輸出 }
}.start();
對於這個Toast在非同步運行,也沒什麼需要小明解釋的。但是在後面將要寫的剖析Toast的進階部落格中,這點需要掌握了才能更好的全方位定製我們所需要的Toast。
如果覺得寫得還可以的就點個贊n(*≧▽≦*)n。。。。。。更要謝謝大家花時間看這篇基礎部落格。
enjoy風鈴
出處:http://www.cnblogs.com/net168/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則下次不給你轉載了。
Android:談一談安卓應用中的Toast情節(基礎)