Android 自定義Toast及BUG

renke發表於2021-09-09

寫這篇文章算是一個總結吧,總結一些使用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的時候加一個延時操作,我這裡就不演示了。



作者:鍵盤上的麒麟臂
連結:



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/430/viewspace-2821999/,如需轉載,請註明出處,否則將追究法律責任。

相關文章