Android:談一談安卓應用中的Toast情節(基礎)

前言android

  Toast,這個曾經也是如今正在迷倒萬千軟件開發者尤爲是android開發者的小美女,向來不乏在各個明星應用中頻繁登場。Toast是神馬~據說是一種吐司麪包,能吃嗎?若是手機屏幕是巧克力作的,我以爲興許味道還不錯的說。言歸正傳,先來講一說Toast的應用場景,畢竟Toast哥也是見過大場面的人兒了。張三正打算拿在移動互聯網上衝一個浪,忽然Toast一個:「網絡不給力啊,我都拿不到數據了」;李四要安裝應用到內存卡,這時Toast一個:「你窮的連內存卡都買不起呀,我都找不着地兒安裝了」;王五玩累遊戲要退出應用,退出時Toast一個:「別這樣嘛,你真要走了?」。因此,鑑於Toast哥已經遍及在大街小巷的種種應用中深刻人心,這個Toast咱們不該該好好玩轉一下嗎?想一想還有點小激動呢。網絡

  可是如今有人要說了,Toast一個還不容易?直接app

Toast.makeText(MainActivity.this, 「Toast一下」, Toast.LENGTH_LONG).show();

不就出現了,這還有什麼好研究的嗎?那麼,我恭喜你,你掌握了Toast的最基本的用法,也具有了讀懂接下來所需的儲備知識。異步

  那麼問題來了:咱們應該掌握Toast的哪些基礎知識呢?ide

-----------------------------------------我是分割線(本篇博客立足基礎,後面將會發布兩篇乾貨的Toast博客)--------------------------------------------oop

 普通的Toast佈局

  所謂萬丈高樓平地起,,D罩胸圍A罩起;基礎紮實了,啥都不是事兒。案例驅動,每每是最好理解滴~post

  某天小明菜鳥接到一個活兒,老大叫他把應用中的出意外的地方(參考網絡出錯、誤操做)向用戶展現出來,但並不須要用戶回饋。小明這時信心滿滿了,就這點功能,可不就是Toast就能夠完美解決的嗎。在程序中須要的地方ctrl+c and ctrl+v 下面代碼,三下五除二的就搞定了,恩,就是這樣了。測試

Toast.makeText(MainActivity.this, 「Toast一下」, Toast.LENGTH_LONG).show();

小明雖然是菜鳥可是很好學的,不只把代碼糊弄好了,順便也研究了一下Toast的基本用法,總結出幾條:this

一、Toast.makeText()會返回Toast實例,咱們能夠先獲取Toast實例,再調用Show()方法顯示。

二、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)也進行了簡單的分析:

一、gravity是輸入Toast須要顯示的位置,例如CENTER_VERTICAL(垂直居中)、CENTER_HORIZONTAL(水平居中)、TOP(頂部)等等。

二、xOffset則是決定Toast在水平方向(x軸)的偏移量,偏移量單位爲,大於0向右偏移,小於0向左偏移,等於0因爲小明太懶因此沒解釋。

三、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的ImageView
toastView.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的,具體請參加谷歌文檔。因此不會出現報錯。

方法二:咱們能夠強行在子線程中執行,只須要獲取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/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然下次不給你轉載了。

相關文章
相關標籤/搜索