Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中如何自己定義吐司(Toast)

Android中如何自己定義吐司(Toast)

編輯:關於Android編程

Android系統裡面有個東西很好用,也很常用,那就是Toast,但是長期使用也會發現,Toast有他的不足之處:形式單一,只有文字,風格不變等等,那麼要如何自定義一個Toast呢,我們可以先從分析Android定義Toast的代碼著手:

Toast的makeText方法


\ \


這裡實際上Android所做的工作是將Toast顯示的文本和持續時間設置了一下,然後返回了Toast對象,用以執行show()方法。這裡核心的地方是要弄明白

\


<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1eLSu77kQW5kcm9pZNf2wcvSu9CpyrLDtLmk1/ejrM/Cw+bO0sPHvMzQ+L+0o7o8L3A+CjxwPjxicj4KPC9wPgo8cD48aW1nIHNyYz0="/uploadfile/Collfiles/20140921/20140921094339157.png" alt="\">

這裡實際上是new 了一個TN()對象,然後對TN對象設置了一些關於位置和偏移的參數。那麼那個TN是何方神聖呢?我們可以繼續往下看:


\


我們可以發現,TN的構造函數裡面執行了一個handleShow的方法


\


我們可以發現handleshow這個方法執行了一大堆的語句,但是實際上我們需要重點關注的只有一句,也就是上面選中的一句:mWM.addView(mView,mParams);


實際上這個mWM是一個WindowManager,mView是要顯示的組件的view,而mParams應該是參數的設置一類,但是具體是何方神聖呢?我們可以在Toast類中找到一個成員變量

\


我們發現mParams實際上是WindowManager的一個布局參數。但是如果單從handleShow方法來看mParams的設置感覺還是太亂,我們可以在Toast中找到下面這一段


\


在這裡我們可以比較清楚看到mParams的一部分主要參數設置,其中包含了長寬都是wrap_content,然後是半透明的(TransLucent),然後還設置了一個動畫效果(Animation_Toast),和一個標題(setTitle("Toast"))最後設置了Toast一些標識比如讓屏幕亮起,不可觸摸,不可獲取焦點等。


到這裡,我們基本上清楚了Toast是如何顯示出來的,核心的在於使用一個WindowManager的addView方法,將要顯示的view和參數mParams傳進來,但是在此之前還需要設置mParams的一些參數;


那麼這裡是顯示,Toast是如何讓顯示消失的呢?我們可以在handleShow方法下面找到一個handHide的方法


\


同樣核心語句也是選中的一句,mWM.removeView(mView),這樣就讓Toast消失掉了


那麼有了上面的一些分析,我們不難寫出我們自己的Toast類,裡面提供一些靜態方法,讓我們來自己定義Toast的顯示風格和顯示內容,也可以控制Toast的顯示開始和結束的時機。

下面的自定義Toast類,提供了幾種形式的show方法,可以像傳統Toast一樣,傳入文本來顯示一個testview,也可以完全自己定義傳入view對象和mParams參數,這樣可以定義出了一個完全自己定義的Toast


package com.alexchen.mobilesafeexercise.ui;

import android.content.Context;
import android.graphics.PixelFormat;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 自定義吐司
 * 
 * @author Alex
 * 
 */
public class MyToast {
	/**
	 * 窗體管理者
	 */
	private static WindowManager wm;
	private static WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
	private static View mView;
	private static TextView tv;

	/**
	 * 顯示自定義吐司
	 * 
	 * @param info
	 * @param context
	 */
	public static void show(String message, Context context) {
		wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
		tv = new TextView(context);
		tv.setText(message);
		tv.setTextSize(20);
		// 原來TN所做的工作
		WindowManager.LayoutParams params = mParams;
		params.height = WindowManager.LayoutParams.WRAP_CONTENT;
		params.width = WindowManager.LayoutParams.WRAP_CONTENT;
		params.format = PixelFormat.TRANSLUCENT;
		params.type = WindowManager.LayoutParams.TYPE_TOAST;
		params.setTitle("Toast");
		params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
				| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
				| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;

		wm.addView(tv, params);

	}

	/**
	 * 自定義文本吐司的顯示方法,這個方法提供了更多自定義的內容,比如textview可以應用一個傳入的style的id
	 * 
	 * @param message
	 * @param context
	 * @param textViewResid
	 * @param params
	 */
	public static void show(String message, Context context, int textViewResid,
			WindowManager.LayoutParams params) {
		wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
		tv = new TextView(context);
		// 多加了一個風格
		tv.setTextAppearance(context, textViewResid);
		// 原來TN所做的工作
		// WindowManager.LayoutParams params = mParams;
		// params.height = WindowManager.LayoutParams.WRAP_CONTENT;
		// params.width = WindowManager.LayoutParams.WRAP_CONTENT;
		// params.format = PixelFormat.TRANSLUCENT;
		// params.type = WindowManager.LayoutParams.TYPE_TOAST;
		// params.setTitle("Toast");
		// params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
		// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
		// | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;

		wm.addView(tv, params);
	}

	/**
	 * 更多自定義的形式,可以直接傳入任一個自己定義好的view,自己設置wm的參數
	 * 
	 * @param view
	 * @param context
	 * @param params
	 *            WindowManager.LayoutParams類型的參數, WindowManager.LayoutParams
	 *            mParams = new WindowManager.LayoutParams(); params.height =
	 *            WindowManager.LayoutParams.WRAP_CONTENT; params.width =
	 *            WindowManager.LayoutParams.WRAP_CONTENT; params.format =
	 *            PixelFormat.TRANSLUCENT; params.type =
	 *            WindowManager.LayoutParams.TYPE_TOAST;
	 *            params.setTitle("Toast"); params.flags =
	 *            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
	 *            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
	 *            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
	 */
	public static void show(View view, Context context,
			WindowManager.LayoutParams params) {
		wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
		MyToast.mView = view;
		wm.addView(mView, params);

	}

	/**
	 * 隱藏自定義吐司 這裡一定要記得判空一下,因為平時沒有打電話時,這兩個量應該都是空的
	 */
	public static void hide() {
		if (wm != null) {
			if (tv != null) {

				wm.removeView(tv);

				tv = null;
			}
			if (mView != null) {

				wm.removeView(mView);

				mView = null;
			}
			if (tv == null && mView == null) {
				wm = null;
			}

		}
	}

}



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved