天天看點

點選PopupWindow彈出視窗之外的區域關閉該視窗的方法

之前做了一個彈出視窗使用alertdialog來實作的,效果很不錯google都給加了特效,如視窗的邊框,視窗的标題以及後面activity的蒙灰,然後用傳回鍵關閉,原本都做好了可是需求忽然變了,想要加一個關閉按鈕,可是alertdialog的title位置擋着,沒辦法在右上角加一個title,如圖

點選PopupWindow彈出視窗之外的區域關閉該視窗的方法

 ,是以想了一個新的互動方式,點選視窗之外來關閉視窗,可是查了好久發現google根本沒提供一個全屏的對象,無法擷取除了這個alertdialog之外界面的點選事件,于是經過多方研究發現了另一個彈出視窗popupwindow,這個東西的确不錯,下面來講一下這個東西的實作方法。View popupWindow_view = getLayoutInflater().inflate(R.layout.detailinfo, null,false);   

popupWindow = new PopupWindow(popupWindow_view, 300, 200, true);

popupWindow.setOutsideTouchable(true);

popupWindow.setFocusable(false);

popupWindow.showAtLocation(findViewById(R.id.Detail), Gravity.CENTER, 0, 0);  

這個popupwindow的實作方法大家可以上網上找,很多執行個體我就不詳細說了,大概就是上面這幾行代碼,其他的按鈕什麼的用

popupWindow.findviewbyid()就能擷取到,進行onclick事件就行,這裡面主要有用的是

popupWindow.setOutsideTouchable(true);

popupWindow.setFocusable(false);這兩行,當你吧這兩行寫上之後,你會發現後面的界面你也是可以點選的,而不是像alertdialog那樣将後面的pause了,然後再修改onTouchEvent方法

public boolean onTouchEvent(MotionEvent event) {

   // TODO Auto-generated method stub

   if (popupWindow != null && popupWindow.isShowing()) {

   popupWindow.dismiss();

   }

   return super.onTouchEvent(event);

}

這樣隻要你點選popupwindow之外的界面就會執行onTouchEvent方法,進而這個界面就會關閉,功能實作了,這個功能可能網上還是有介紹的,我在這裡又說了一邊,可能不太詳細新手看不太明白,不過你先把popupwindow弄懂了應該能看明白,這個功能一般網上介紹都是ucweb的那個設定界面,在螢幕最下方出現,可擴充性也很大,而且如果不設定android:background的話彈窗是透明的,界面全部自定義而且還可以完成點選關閉功能,如果你覺得夠用可以到此為止了,可是我還沒有寫完,因為這個效果在我的需求中實作後真的非常難看,醜爆了。。。。。貼一張圖

點選PopupWindow彈出視窗之外的區域關閉該視窗的方法

 就是這樣我勒個去,我是受不鳥了。。。。第一沒有視窗的邊框,alertdialog是google給帶的,而且背景不蒙灰,效果超級差,而且我還得吧後面的界面裡面的listview給屏蔽了,否則點選螢幕外則又打開另一個彈窗了,大家可以對比一下兩個圖,這是沒有處理之前的,界面不好看好說大不了做張圖當背景,但是蒙灰怎麼辦呢?經過研究終于發現了解決方案~~~那就是popupWindow = new PopupWindow(popupWindow_view, 300, 200, true);這個中的300和200改成 LayoutParams.FILL_PARENT,這樣就是一個全屏的彈窗,然後将彈窗最外面的linaelayout A設定一個android:background="#b0000000"半透明背景,就可以擷取到一個“彈窗外”(實際在彈窗裡面,彈窗是全螢幕的,隻不過使用者看起來是中間是個彈窗,邊上是蒙灰)的對象了,将最外面的linaelayout A執行個體化這樣我們就可以監聽他的點選事件了,這裡跟大家解釋一下當觸發裡面按鈕的點選事件時候不會除外這個linaelayout A的點選事件,但是如果裡面沒有點選事件就會觸發,也就是說現在如果點選上面的圖示和名稱因為他們沒有響應事件,也會觸發最外層linaelayout A的點選事件(而點選按鈕則不會),是以我将标題位置的linaelayout B也加了一個空點選事件(就是圖示和名稱的位置),不做任何操作,就是為了搶外層linaelayout A的點選操作。然後再linaelayout A的點選監聽裡面加入 

if (popupWindow != null && popupWindow.isShowing()) {

   popupWindow.dismiss();

   }就可以了。

另外附上一個彈出視窗帶邊框的背景,我也是在網上找的,多學學shape繪圖挺好的,我就打算深入研究一下,附圖一張看效果 

點選PopupWindow彈出視窗之外的區域關閉該視窗的方法

 感覺好多了呵呵!~~~

這是帶邊框的背景

<shape xmlns:android="http://schemas.android.com/apk/res/android"

        android:shape="rectangle">

        <gradient android:startColor="#c3456789" android:endColor="#c0000000"

                android:angle="90" /><!--背景顔色漸變 -->

        <stroke android:dashWidth="1dp" android:dashGap="0dp"

                android:width="1dp" android:color="#A4A5A4"></stroke>

        <!--描邊 -->

        <corners android:bottomRightRadius="5dp"

                android:bottomLeftRadius="5dp" android:topLeftRadius="5dp"

                android:topRightRadius="5dp" /><!--設定圓角-->

</shape>

這個帶邊框的背景貼到一個XML檔案中,這裡檔案名為shape_circle_corner.xml ,

然後放到/res/drawable/shape_circle_corner.xml 目錄下。效果不錯

源碼因為是一個打的項目,沒法發上了,發上來你看着也亂,是以都是說的,寫的有點亂,大家先看有不明白的可以再問我哈~~~~其實我就是提供個思路,思路有了就很好做了

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=148247

<!--EndFragment-->

http://warnerhit.iteye.com/blog/1328994

繼續閱讀