您好,登錄后才能下訂單哦!
Android Toast是一種比較特殊的顯示信息的機制,其沒有焦點,并且顯示一段時間之后就自動消失。Android 中提供的顯示時長通過Toast.LENGHT_LONG和Toast.LENGTH_SHORT來指定,底層具體代表的時間長度分別是3.5s和2.0s。
本文介紹如何使得Toast顯示的時間更長或者指定顯示時間長度。
1. 基本用法代碼示例
/** * Toast默認的長時間顯示 3.5s */ @OnClick(R.id.one_button) public void onClickOneButton() { Toast.makeText(this, "Hello World", Toast.LENGTH_LONG).show(); } /** * Toast默認的短時間顯示 2.0s */ @OnClick(R.id.two_button) public void onClickTwoButton() { Toast.makeText(this, "Hello World", Toast.LENGTH_SHORT).show(); }
2. 通過android.os.CountDownTimer類實現Toast的顯示和消失
通過點擊下圖中的底端左Button使得Toast顯示,右Button使得Toast消失。
代碼示例:
/** * 使用CountDownTimer實現Toast自定義時間顯示 */ @Bind(R.id.three_textView) public TextView threeTextView; private Toast mCountDownTimeToast; public CountDownTimer cdt = new CountDownTimer(60 * 1000, 1000) { @Override public void onTick(long millisUntilFinished) { threeTextView.setText("Time剩余:" + (millisUntilFinished / 1000) + "s"); if (null != mCountDownTimeToast) { mCountDownTimeToast.show(); } } @Override public void onFinish() { threeTextView.setText("顯示完成"); if (null != mCountDownTimeToast) { mCountDownTimeToast.cancel(); } } }; @OnClick({R.id.three_button_start, R.id.three_button_cancel}) public void onClickThreeButton(View v) { if (null == mCountDownTimeToast) { mCountDownTimeToast = makeToast(this); mCountDownTimeToast.setGravity(Gravity.TOP | Gravity.LEFT, 30, 30); } if (v.getId() == R.id.three_button_start) { cdt.start(); Log.d(TAG, "CountDownTimer start show"); } if (v.getId() == R.id.three_button_cancel) { cdt.cancel(); threeTextView.setText("取消"); Log.d(TAG, "CountDownTimer cancel"); } }
Toast對象的View布局文件(view_toast.xml)
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#ef3939" android:orientation="vertical" android:gravity="center_vertical|center_horizontal" android:padding="10dp" android:text=""Hello World"" android:textColor="#f7f9fb"> </TextView>
創建Toast對象(下文中創建Toast對象使用該方法)
public static Toast makeToast(Context context) { Toast toast = new Toast(context); toast.setDuration(Toast.LENGTH_SHORT); TextView view = (TextView) LayoutInflater.from(context).inflate(R.layout.view_toast, null); toast.setView(view); return toast; }
上述代碼通過CountDownTimer實現指定Toast顯示時長和控制Toast顯示與消失,重構之后代碼如下:
public void showToast1(final Toast toast, long duration) { final long SHORT = 2000; final long LONG = 3500; final long ONE_SECOND = 1000; final long d = duration <= SHORT ? SHORT : duration > LONG ? duration : LONG; new CountDownTimer(Math.max(d, duration), ONE_SECOND) { @Override public void onTick(long millisUntilFinished) { toast.show(); } @Override public void onFinish() { toast.cancel(); } }.start(); }
3.通過Handler消息機制實現
public void showToast2(final Toast toast, long duration) { final long SHORT = 2000; final long LONG = 3500; final long ONE_SECOND = 1000; final long d = duration <= SHORT ? SHORT : duration > LONG ? duration : LONG; final int what = 1; final Handler handler = new Handler() { long remainder = d; @Override public void handleMessage(Message msg) { if (msg.what == what) { toast.show(); if (remainder >= ONE_SECOND) { remainder -= ONE_SECOND; sendEmptyMessageDelayed(what, ONE_SECOND); } else { removeMessages(what); } } } }; handler.sendEmptyMessage(what); }
其實這種實現和CountDownTimer實現的機制一樣的。
4. Toast的指定時長顯示其實就是不斷的調用Toast的show()方法,其中show()方法中實現了將Toast對象添加到INotificationManager的Toast隊列中去。具體細節可參見Toast(android.widget.Toast)源碼。
5. 為什么要給Toast指定顯示時長呢?
這或許不是個好主意。Toast的無焦點短時間自動消失機制就是為了給用戶顯示信息而不會產生較大干擾。如果長時間顯示并且具有更多交互和事件處理,這就背離了Toast的本意,這樣的場景可以考慮使用Notification,Dialog來實現。
使用Toast場景中更多的是關注其View和顯示的位置,這可以實現更多有意思的東西,比如冒泡提示,使用向導等。在實踐中則需要根據具體情況慎重選擇和合理應用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。