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

來源:互聯網
上載者:User

標籤: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情節(基礎)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.