Android 自定義Toast,修改Toast樣式和顯示時長
Android 中有一個 Toast 控制元件,可以用來顯示提示資訊,還是非常好用的,但是樣式和顯示時長比較侷限。所以我們來自定義一個
Toast ,讓它可以顯示我們想要的效果,並能設定顯示時長。
首先,在 res\layout 資料夾下建立自定義 Toast 的佈局檔案 custom_toast.xml,用來設定 Toast 的樣式:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toast_custom_parent"
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="75dp"
android:background="@drawable/toast_customer_style"
android:gravity="center"
android:textColor="#FFFFFF" />
</LinearLayout>
這裡的自定義 Toast 其實就是一個TextView ,其中引用了 res\drawable 資料夾下的一個 shape 樣式檔案:
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 設定背景透明度和顏色 -->
<solid android:color="#99000000" />
<!-- 設定四個角為弧形 -->
<corners android:radius="23dp" />
<padding
android:left="23dp"
android:right="23dp" />
</shape>
到這裡,所有的佈局就已經設計好了,也就是實現了自定義樣式,接下來就是在程式碼中實現自定義 Toast 了,以及實現設定顯示時
長:
public class CustomToast {
private boolean 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()
*/
public void show(String text, int duration) {
time = new TimeCount(duration, 1000);
toast_content.setText(text);
if (canceled) {
time.start();
canceled = false;
showUntilCancel();
}
}
/**
* 隱藏Toast
*/
public void hide() {
if (toast != null) {
toast.cancel();
}
canceled = true;
}
private void showUntilCancel() {
if (canceled) {
return;
}
toast.show();
handler.postDelayed(new Runnable() {
public void run() {
showUntilCancel();
}
}, 3000);
}
/**
* 計時器
*/
class TimeCount extends CountDownTimer {
public TimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval); // 總時長,計時的時間間隔
}
@Override
public void onFinish() { // 計時完畢時觸發
hide();
}
@Override
public void 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;
private void 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);
}
這樣我們就可以在 onClick 等事件中通過呼叫 toastMessage("自定義 Toast 的顯示內容 "); 來顯示你想要給使用者看到的提示內容了。相關文章
- 自定義Toast樣式AST
- 自定義Toast樣式+改變Toast寬高AST
- mui toast自定義樣式UIAST
- 【Android開發點滴】自定義Toast樣式AndroidAST
- Android 自定義Toast實現多次觸發只會顯示一次toastAndroidAST
- Android自定義ToastAndroidAST
- 自定義ToastAST
- Android Toast 預設和自定義使用AndroidAST
- Android 自定義Toast及BUGAndroidAST
- Android中自定義Toast文字大小AndroidAST
- Ionic3全域性修改toast樣式AST
- Android-重新包裝Toast,自定義背景AndroidAST
- Android中自定義特定顏色的ToastAndroidAST
- Android 程式設計程式碼-自定義 ToastAndroid程式設計AST
- 一個可以自定義的ToastAST
- 微信小程式之『自定義toast』微信小程式AST
- Android Toast 自定義背景、圖片 隨心使用AndroidAST
- Android自定義邊框背景顏色的ToastAndroidAST
- Android 防止多次點選,Toast重複顯示AndroidAST
- 自定義Toast及視窗透明處理AST
- 百度小程式自定義通用toast元件AST元件
- Android Toast小解AndroidAST
- uni-app 自定義loading 自定義toast 相容小程式&APPAPPAST
- 自定義Toast的背景顏色大小及字型大小AST
- ToastAST
- android Toast五種特效AndroidAST特效
- android自定義button樣式Android
- 基於手淘 flexible 的 Vue 元件:Toast -- 顯示框FlexVue元件AST
- Android學習之路五:Dialog和ToastAndroidAST
- 微信開發之自定義元件(Toast)元件AST
- WPF 不帶 TargetPlatformVersion 顯示 Win10 的 Toast 通知的方法PlatformWin10AST
- [Android] Toast問題深度剖析(二)AndroidAST
- [Android] Toast問題深度剖析(一)AndroidAST
- Android 5中不同效果的ToastAndroidAST
- Android App中使用全域性ToastAndroidAPPAST
- van-toastAST
- Android 通知欄顯示自定義通知時設定更高的高度Android
- 自定義 RMAN 顯示的日期時間格式