[转]popwindow用法
[转]弹出窗口的两种实现方式 PopupWindow 和 Activity
本人小菜一个。目前只见过两种弹出框的实现方式,第一种是最常见的PopupWindow,第二种也就是Activity的方式是前几天才见识过。感觉很霸气哦。没想到,activity也可以做伪窗口。
先贴上最常见的方法,主要讲activity的方法。
一、弹出PopupWindow

1 /**
2 * 弹出menu菜单
3 */
4 public void menu_press(){
5 if(!menu_display){
6 //获取LayoutInflater实例
7 inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
8 //这里的main布局是在inflate中加入的哦,以前都是直接this.setContentView()的吧?呵呵
9 //该方法返回的是一个View的对象,是布局中的根
10 layout = inflater.inflate(R.layout.main_menu, null);
11
12 //下面我们要考虑了,我怎样将我的layout加入到PopupWindow中呢???很简单
13 menuWindow = new PopupWindow(layout,LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); //后两个参数是width和height
14 //menuWindow.showAsDropDown(layout); //设置弹出效果
15 //menuWindow.showAsDropDown(null, 0, layout.getHeight());
16
17 //设置如下四条信息,当点击其他区域使其隐藏,要在show之前配置
18 menuWindow.setFocusable(true);
19 menuWindow.setOutsideTouchable(true);
20 menuWindow.update();
21 menuWindow.setBackgroundDrawable(new BitmapDrawable());
22
23 mClose = (LinearLayout)layout.findViewById(R.id.menu_close);
24 menuWindow.showAtLocation(this.findViewById(R.id.schoolmain), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0,50); //设置layout在PopupWindow中显示的位置
25 //如何获取我们main中的控件呢?也很简单
26 mMainbtn = (LinearLayout)layout.findViewById(R.id.menu_main_btn);
27 mHistorybtn = (LinearLayout) layout.findViewById(R.id.menu_history_btn);
28 mHelpbtn = (LinearLayout) layout.findViewById(R.id.menu_help_btn);
29
30
31
32 //下面对每一个Layout进行单击事件的注册吧。。。
33 //比如单击某个MenuItem的时候,他的背景色改变
34 //事先准备好一些背景图片或者颜色
35 mMainbtn.setOnClickListener (new View.OnClickListener() {
36 @Override
37 public void onClick(View arg0) {
38 mywebView.loadUrl(URL);
39 menuWindow.dismiss(); //响应点击事件之后关闭Menu
40 }
41 });
42 mHelpbtn.setOnClickListener (new View.OnClickListener() {
43 @Override
44 public void onClick(View arg0) {
45 mywebView.loadUrl(URL);
46 menuWindow.dismiss(); //响应点击事件
47 }
48 });
49 mHistorybtn.setOnClickListener (new View.OnClickListener() {
50 @Override
51 public void onClick(View arg0) {
52 mywebView.loadUrl(URL);
53 menuWindow.dismiss(); //响应点击事件
54 }
55 });
56 menu_display = true;
57 }else{
58 //如果当前已经为显示状态,则隐藏起来
59 menuWindow.dismiss();
60 menu_display = false;
61 }
62
63 }
64
65 public void back_press(){
66
67 if(menu_display){ //如果 Menu已经打开 ,先关闭Menu
68 menuWindow.dismiss();
69 menu_display = false;
70 }
71 else {
72 Intent intent = new Intent();
73 intent.setClass(MainActivity.this,Exit.class);
74 startActivity(intent);
75 }
76 }
这种方法很简单,要注意的是如果要想点击其他地方使其隐藏,要在show设置四条属性如下:
// 使其聚焦
mPopupWindow.setFocusable(true);
// 设置允许在外点击消失
mPopupWindow.setOutsideTouchable(true);
//刷新状态
mPopupWindow.update();
//点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作
mPopupWindow.setBackgroundDrawable(new BitmapDrawable());
二、Activity做伪弹窗

本人感觉这个很先进啊。恕我冒犯,我只这里直接写上牛人的代码。此牛人写的是防微信的demo。做的相当好,我在后面附上CSDN免费下载链接。
先贴上java代码——Exit.java
1 package cn.buaa.myweixin;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.view.MotionEvent;
6 import android.view.View;
7 import android.view.View.OnClickListener;
8 import android.widget.LinearLayout;
9 import android.widget.Toast;
10
11 public class Exit extends Activity {
12
13 private LinearLayout layout;
14 @Override
15 protected void onCreate(Bundle savedInstanceState) {
16 super.onCreate(savedInstanceState);
17 setContentView(R.layout.exit_dialog);
18 layout=(LinearLayout)findViewById(R.id.exit_layout);
19 layout.setOnClickListener(new OnClickListener() {
20
21 @Override
22 public void onClick(View v) {
23 // TODO Auto-generated method stub
24 Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
25 Toast.LENGTH_SHORT).show();
26 }
27 });
28 }
29
30 @Override
31 public boolean onTouchEvent(MotionEvent event){
32 finish();
33 return true;
34 }
35
36 public void exitbutton1(View v) {
37 this.finish();
38 }
39 public void exitbutton0(View v) {
40 this.finish();
41 MainWeixin.instance.finish();//关闭Main 这个Activity
42 }
43 }
附上布局文件:exit_dialog.xml
分析,弹出exit这个框很简单,本身就是activity,在主界面用startavtivity等方法像普通activity启动。
关键是如何做到点击其他地方退出和如何关闭程序。
1、点击其他地方退出,只要监听OnClickListener让所有的点击都退出就行了(除了xml中指定按钮事件之外)。
2、退出主程序。只要在出程序中将主程序自己设置成静态对象,在外部调用即可 public static MainWeixin instance=null;
上面的布局和activity并不能将activity的窗体展现在主界面之上,看起来像个弹出框。下面是弹出框的styles配置:
1 <style name="MyDialogStyle">
2 <item name="android:windowBackground">@android:color/transparent</item>
3 <item name="android:windowFrame">@null</item>
4 <item name="android:windowNoTitle">true</item>
5 <item name="android:windowIsFloating">true</item>
6 <item name="android:windowIsTranslucent">true</item>
7 <item name="android:windowContentOverlay">@null</item>
8 <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
9 <item name="android:backgroundDimEnabled">true</item>
10 </style>
下面我们来分析一下这个布局的含义及重点:
重点1、<item name="android:windowBackground">@android:color/transparent</item>窗口背景色
重点2、<item name="android:windowFrame">@null</item>Dialog的windowFrame框为无
重点4、<item name="android:windowIsFloating">true</item>是否浮现在activity之上
重点5、<item name="android:windowIsTranslucent">true</item>窗口是否半透明——是(与第一条配合使用)
重点6、<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>窗口弹出效果
重点7、<item name="android:backgroundDimEnabled">true</item> 是否允许背景模糊
重点8、<item name="android:windowContentOverlay">@null</item>这个不设置的话,可能会出现边框黑线
以上代码都是牛人们的功劳,我拿来做一分析,给更多需要的朋友。
我在众多牛人的指引下一步步成长,感谢牛人们。
参考链接:
Dialog 顶部黑线问题
demo下载
buaa版防微信demo http://download.csdn.net/detail/win_xiang/4788158
[转]popwindow用法的更多相关文章
- 点击Listview弹出PopWindow的用法
先来张截图: 如图点击listview中的Item在item的下方弹出一个框框,这个框框就是用的Popwindow. 用法很简单:首先写一个PopupWindow并自定义它的布局: ...
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
- 【JavaScript】innerHTML、innerText和outerHTML的用法区别
用法: <div id="test"> <span style="color:red">test1</span> tes ...
- chattr用法
[root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...
随机推荐
- ActiveMQ(5.10.0) - Wildcards and composite destinations
In this section we’ll look at two useful features of ActiveMQ: subscribing to multiple destinations ...
- Networking - ICMP 协议
发送到远程计算机的数据通常发经过一个或多个路由器,这些路由器在把数据传输到最终目的地的过程中可能发生多种问题.路由器利用 ICMP 把问题通知给源 IP.ICMP 还有用于其他调试和排错的功能. IC ...
- 用命令行将Java程序打包为jar文件
如何把写好的Java程序打包为jar文件呢?有两种方式可以选择 1.命令行的方式: 打包jar cf JAR文件名称 程序文件名称或者程序所在的文件夹举例:jar cf MyApp.jar D:Jav ...
- oracle11g 创建用户并授权
Oracle创建用户并给用户授权查询指定表或视图的权限用sys账户登录数据库进行如下操作: CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND DEFAUL ...
- MD5和Base64介绍与应用
MD5:概念:MD5是一种不可逆的消息摘要算法.为计算机安全领域广泛使⽤的一种散列函数, 用以提供消息的完整性保护.效果:把一个任意长度的字节串变换成⼀定⻓度的⼗六进制数字串. 目的是让⼤容量信息在⽤ ...
- 1.6建造者模式(生成器模式) Builder
1.概念:将一个复杂对象的构建和他的表示分离,使得同样的构件可以创建不同的表示. 2.实例:肯德基和中餐,肯德基抽象了整个做菜的复杂过程(相同的构建),然后在不同的店铺进行实现(不同的表示).中餐往往 ...
- 【转载】干货来袭!Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载七)LAMP集成安装
学Linux做程序开发也好,做系统管理也好,做网络管理员也好,做系统运维也好,不会LAMP和LNMP,那就等于连皮毛都不会!本篇是文字版的LAMP集成安装,下次连载我们要介绍LNMP的文字版安装.有喜 ...
- LINQ中实现 In 与 Not In
T-SQL的IN: Select ProductID, ProductName, CategoryID From dbo.Products , ) T-SQL的NOT IN: Select Produ ...
- awk!字符问题,修复中!.......
awk '条件类型1{动作1} 条件类型2{动作2}' file1 file2 变量名称:1.NF 每一行($0表示文本所有域)拥有的字段数. 2.NR目前awk处理的"第n行"数 ...
- Java中的队列:java.util.Queue接口
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作. Queue接口与List.Set同一级别,都是继承了Collection接口.Linked ...