編輯:關於Android編程
開發這個程序之前先解釋一下,為什麼Toast信息提示框在顯示一定時間後會自動消失?因為在Android系統中有一個Toast隊列,系統會依次從這個隊列中取出一個Toast,並顯示它。在顯示了指定時間之後,便關閉它。那麼可不可以讓Toast信息提示框一直顯示呢?這個要求對於Toast來說有點強人所難了,因為,Toast本身並沒有提供這個功能。那麼怎麼才能讓Toast一直顯示,並在我們的控制之下關閉呢?代碼是死的,人是活的。下面就叫代碼說話:
看一下Toast的show方法的源碼:
public void show() { if (mNextView == null) { throw new RuntimeException("setView must have been called"); } INotificationManager service = getService(); String pkg = mContext.getPackageName(); TN tn = mTN; tn.mNextView = mNextView; try { service.enqueueToast(pkg, tn, mDuration); } catch (RemoteException e) { // Empty } }
在上面的代碼中Toast已經告訴我們了,它本身並不負責信息提示框的顯示與關閉,它只是將Toast加入到系統的Toast隊列中,再由系統根據Toast隊列來顯示和關閉Toast信息提示框。現在我們可以做一個大膽的推斷,既然Toast的show方法是將Toast放到系統的Toast隊列中,那麼我們就不使用show方法,我們自己來控制Toast的顯示與關閉。
查看Toast類源碼可以找到一個TN類,該類是Toast的一個內嵌類。在TN類中有個show方法,系統是從Toast隊列中獲得Toast對象之後,利用TN對象的show方法顯示Toast再利用TN.hide方法關閉Toast。如果我們能夠獲取TN對象那麼就能控制Toast的顯示與關閉。但TN被聲明成private,外部無法訪問。不過Toast類中有個mTN對象,雖然它不是我public但我們可以通過Java反射技術來訪問該對象。mTN會在創建Toast對象時初始化。所以,只要獲得mTN對象也就獲得了TN對象。下面代碼顯示了一個永不關閉的Toast信息提示框。
Toast toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT); //設置Toast的顯示位置 toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0); try { //通過反射技術,從toast對象中獲取mTN對象 Field field = toast.getClass().getDeclaredField("mTN"); field.setAccessible(true); obj = field.get(toast); //從TN對象中獲得show方法 Method method = obj.getClass().getDeclaredMethod("show", null); //調用TN對象的show方法來顯示Toast信息提示框 method.invoke(obj, null); } catch (Exception e) { }
上面代碼先通過事先創建好的Toast對象獲得mTN對象,然後在利用反射技術獲得TN對象的show方法。
關閉Toast的方法和顯示Toast的方法類似,只需要獲得hide方法即可。
Method method = obj.getClass().getDeclaredMethod("hide", null); method.invoke(obj, null);
PullToRefresh是一套實現非常好的下拉刷新庫,它支持: ListView ExpandableListView GridView WebView ScrollV
在開發java工程時,一個項目可能分為多個模塊,為了實現模塊間的解耦和獨立,提高模塊的復用性,通常將項目按模塊分為多個java工程進行開發,最後通過jar包等工
Intent簡介Android中提供了Intent機制來協助應用間的交互與通訊,Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根
效果圖:以上效果類似於顯示點贊用戶的界面,我們可以通過點擊不同的昵稱進入每個人的個人主頁。 關於公共控件,請點擊文章下方的git地址。 第一步:我們為