首先show一下執行結果給大家看,
這一張圖是按下Press to Popup
接著我按下 Press to Popup 之後,彈出了PopupWindow,在PopupWindow中的元件都是View 的元件,並且都可操作
PopupWindow中的元件皆是可操作的,並且當我在 Popup Window 以外的地方作GUI操作時,也都是可以操作的,
如下所示,命名為 Outside 的 Button 是 PopupWindow之外的元件,然而當視窗彈出後,
我們仍然可觸碰到這個元件。
(當然我們也可以透過PopupWindow的函數作設定,讓PopupWindow起來時,使用者無法觸碰到 Outside Button)
因為我想要作是是一個真實感的 PopupWinodw,所以當觸碰範圍操出PopupWindow之外,
便呼叫dismiss() 關掉此PopupWindow,所以會出現如下畫面。
由上圖畫面可看出來,PopupWindow 已經被關掉了。
接下來,本文篇文章解釋一下 PopupWindow class 的用法
「如何在 Android 上運用 PopupWindow class」
本文章是分享給一些有 Android App 初階開發者功力的朋友們。
PopupWindow 這個 class, 從 Eclair 上,目前只發現有 Calendar 的 Application 跟 AutoCompleteTextView 有使用到。
目前發現到 Android 其它彈出視窗的實作,除了用Activity的實作偽裝成 假性Dialog 的方法之外,就是這個 PopupWindow。
所謂的 假性 Dialog 方法,可以參閱 像是 QuickContactActivity.java 的實作,
或者像是 SearchDialog.java 的實作。
(SearchDilaog 的實作可參考 http://wp.me/pMRh0-R )
不過想想 AutoCompleteTextView 的 DropDown Menu 的話,其實還是 PopupWindow
的使用比較 make sense。至少它的特性看起來還不賴。
因此就花了一點時間把 這兩邊的 code 靜態trace一下,
把一些有用的元素抽離出來,所以就形成了這篇文章。
建議有空的話,還是要 trace 一下 PopupWindow 的 source code
如同一般的假性Dialog 的作法,運用dismiss().
透過 Calendar 程式中的 CalendarView.java 的程式
我們發現,只要作如下這件事
mPopup.getContentView().setOnClickListener(new OnClickListener(){
public void onClick(View v) {
mPopup.dismiss();
}
} );
那麼當你的滑鼠觸及其它地方的時候,就可以呼叫 dimiss(),把mPopup關掉了。
因為假設讀者有自己的方法,可以動一下手腳把 dismiss 作的好。
然後比較值得一提的在這邊
要如何作,才能當使用按超出 PopupWindow 的範圍時,
事件能夠放PopupWindow外的 View 所接收,並且PopupWindow會被關上
(就如同 AutoCompleteTextView 的效果一樣)
主要是設 setFocusable為 false
也設 setOutsideTouchable 為 true
LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mPopup = new PopupWindow(inflater.inflate(R.layout.popup_window_layout, null, false), 300, 300, false);
mPopup.setOutsideTouchable(true);
然後PopupWindow 外的元件如果接到 Event的話,
就設 mPopup.dismiss()把PopupWindow關掉
另外 PopupWindow 的 showAsDropDown() 用起來,
似乎是比 showAtLocation 好用多了。
所以如果你是想要作一個可彈出的 ContextMenu,特別建議可以用showAsDropDown()
转载:http://milochen.wordpress.com/2010/06/16/android_popupwindow_class/