Android 自定義Toast,修改Toast樣式和顯示時長
阿新 • • 發佈:2019-01-09
Android 中有一個 Toast 控制元件,可以用來顯示提示資訊,還是非常好用的,但是樣式和顯示時長比較侷限。所以我們來自定義一個
Toast ,讓它可以顯示我們想要的效果,並能設定顯示時長。
首先,在 res\layout 資料夾下建立自定義 Toast 的佈局檔案 custom_toast.xml,用來設定 Toast 的樣式:
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
-
android:id
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical">
- <TextView
- android:id="@+id/tvToastContent"
- android:layout_width="wrap_content"
- android:layout_height="46dp"
-
android:layout_marginBottom
- android:background="@drawable/toast_customer_style"
- android:gravity="center"
- android:textColor="#FFFFFF"/>
- </LinearLayout>
- <?xmlversion="1.0"encoding="UTF-8"?>
-
<shapexmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <!-- 設定背景透明度和顏色 -->
- <solidandroid:color="#99000000"/>
- <!-- 設定四個角為弧形 -->
- <cornersandroid:radius="23dp"/>
- <padding
- android:left="23dp"
- android:right="23dp"/>
- </shape>
長:
- publicclass CustomToast {
- privateboolean canceled = true;
- private Handler handler;
- private Toast toast;
- private TimeCount time;
- private TextView toast_content;
- public CustomToast(Context context, ViewGroup viewGroup) {
- this(context, viewGroup, new Handler());
- }
- public CustomToast(Context context, ViewGroup viewGroup, Handler handler) {
- this.handler = handler;
- View layout = LayoutInflater.from(context).inflate(R.layout.custom_toast, viewGroup);
- toast_content = (TextView) layout.findViewById(R.id.tvToastContent);
- if (toast == null) {
- toast = new Toast(context);
- }
- toast.setGravity(Gravity.BOTTOM, 0, 0);
- toast.setDuration(Toast.LENGTH_LONG);
- toast.setView(layout);
- }
- /**
- * @param text 要顯示的內容
- * @param duration 顯示的時間長
- * 根據LENGTH_MAX進行判斷
- * 如果不匹配,進行系統顯示
- * 如果匹配,永久顯示,直到呼叫hide()
- */
- publicvoid show(String text, int duration) {
- time = new TimeCount(duration, 1000);
- toast_content.setText(text);
- if (canceled) {
- time.start();
- canceled = false;
- showUntilCancel();
- }
- }
- /**
- * 隱藏Toast
- */
- publicvoid hide() {
- if (toast != null) {
- toast.cancel();
- }
- canceled = true;
- }
- privatevoid showUntilCancel() {
- if (canceled) {
- return;
- }
- toast.show();
- handler.postDelayed(new Runnable() {
- publicvoid run() {
- showUntilCancel();
- }
- }, 3000);
- }
- /**
- * 計時器
- */
- class TimeCount extends CountDownTimer {
- public TimeCount(long millisInFuture, long countDownInterval) {
- super(millisInFuture, countDownInterval); // 總時長,計時的時間間隔
- }
- @Override
- publicvoid onFinish() { // 計時完畢時觸發
- hide();
- }
- @Override
- publicvoid onTick(long millisUntilFinished) { // 計時過程顯示
- }
- }
- }
這裡主要通過一個倒計時器和非同步執行緒來實現設定顯示時長。TimeCount 有兩個引數,第一個是倒計時時長,也就是 Toast 要顯示
的時長,第二個是間隔時間,在倒計時內每隔一定時間會回撥一次 onTick 方法,倒計時結束後回撥 onFinish 方法。在倒計時器中我
們要設定的只有倒計時時長,即顯示時長,時間到了就 cancel() 掉 Toast。在對 Toast 初始化時,預設設定的顯示時長是
LENGTH_LONG ,大約為3s,那麼問題來了,3s以內倒計時器可以控制顯示時長,但是超過3s Toast 就自行結束了,如果我們想
要顯示超過三秒怎麼辦,所以這裡通過一個非同步執行緒,並設定一個 postDelayed 任務,推遲3s執行,線上程中呼叫自身的方法,實
現迴圈呼叫。 這樣每隔3s顯示一次 Toast ,達到了一直顯示的效果。然後通過 canceled 屬性,將倒計時器和非同步執行緒聯絡到一起,
這樣就可以通過 Handler 讓 Toast 一直顯示,再通過 TimeCount 讓 Toast 結束顯示,達到了自定義顯示時長的效果。
具體呼叫方法如下:
- private CustomToast toast;
- privatevoid toastMessage(String content) {
- if (toast != null) {
- toast.hide();
- }
- toast = new CustomToast(LoginActivity.this,
- (ViewGroup) this.findViewById(R.id.toast_custom_parent));
- toast.show(content, 500);
- }