之前做了一个弹出窗口使用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>
源码因为是一个打的项目,没法发上了,发上来你看着也乱,所以都是说的,写的有点乱,大家先看有不明白的可以再问我哈~~~~其实我就是提供个思路,思路有了就很好做了 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=148247 |