點擊PopupWindow彈出窗口之外的區域關閉該窗口的方法

之前做了一個彈出窗口使用alertdialog來實現的,效果很不錯google都給加了特效,如窗口的邊框,窗口的標題以及後面activity的蒙灰,然後用返回鍵關閉,原本都做好了可是需求忽然變了,想要加一個關閉按鈕,可是alertdialog的title位置擋着,沒辦法在右上角加一個title,如圖 ,所以想了一個新的交互方式,點擊窗口之外來關閉窗口,可是查了好久發現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的話彈窗是透明的,界面全部自定義而且還可以完成點擊關閉功能,如果你覺得夠用可以到此爲止了,可是我還沒有寫完,因爲這個效果在我的需求中實現後真的非常難看,醜爆了。。。。。貼一張圖 就是這樣我勒個去,我是受不鳥了。。。。第一沒有窗口的邊框,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繪圖挺好的,我就打算深入研究一下,附圖一張看效果  感覺好多了呵呵!~~~

這是帶邊框的背景
<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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章