popupWindow的用法

首先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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值