Android 自定義Toast及BUG
寫這篇文章算是一個總結吧,總結一些使用Toast過程中出現的問題。
Toast彈框的優點在於使用起來方便,但是使用的時候還是有些細節需要注意。
1.自定義Toast
需求:需要展示一個有樣式的提示彈框。那麼有人就會問,用Dialog來做不行嗎?用Dialog來做也行,但是一般的情況下Dialog無法再展示的情況下去點選Activity觸發事件,所以這種情況下最簡單的做法就是自定義Toast
public class MyTipsToast { public void show(Context context, String message){ final Toast toast = new Toast(context.getApplicationContext()); View contentView = LayoutInflater.from(context).inflate(R.layout.test,null); TextView textView = contentView.findViewById(R.id.tv); if (!StringUtils.isEmpty(message)){ textView.setText(message); toast.setView(contentView); toast.setDuration(Toast.LENGTH_LONG); toast.setGravity(Gravity.TOP,0,36); toast.show(); } } }
最後,建議在自定義toast中不要做事件,提示框僅僅為了顯示資訊,如果想要處理事件,使用對話方塊更合適。
2.多個Toast快速顯示的BUG
在展示Toast比較多的情況下基本都會遇到一個問題,關於這個問題,當然不同的機型會出現不同的結果。
比如一些手機,在快速點選彈出Toast的時候,下一條彈出時,會強制關閉上一條,這樣當然是沒有任何問題的,但是有些手機,下一條會等上一條消失後再彈出,這樣時間就會累計起來,彈出多的情況會導致使用者覺得Toast一直不消失,而且還沒有辦法互動性的讓它消失。針對這種機型的Toast,我們需要做適配。
當然這種適配方案網上也有挺多,這裡就不寫出來了,百度一大堆,但是我在試的時候,感覺效果不是很好,所以我自己寫了一種適配方案。
public class ToastUtils { private static Context mContext; private static List<Toast> toastList; public static void init(Context context){ mContext = context; toastList = new ArrayList<>(); } public static void show(String str){ if (mContext == null){ return; } Toast toast = Toast.makeText(mContext, str, Toast.LENGTH_SHORT); toastList.add(toast); if (toastList.size() > 1){ Toast toast1 = toastList.get(0); toastList.remove(0); toast1.cancel(); toast1 = null; } toast.show(); } }
比較投機取巧的方法,用List儲存當前正在顯示的Toast,當下個Toast展示的時候,先cancel掉前一個。只不過這樣寫可能會有個不好的地方是,點得快的時候,會一直替換內容,太快可能會導致使用者沒看清之前顯示的內容是什麼。但是這個也好解決,你可以在show的時候加一個延時操作,我這裡就不演示了。