弹出窗口的两种实现方式 PopupWindow 和 Activity
来源:互联网 发布:广发淘宝卡集分宝 编辑:程序博客网 时间:2024/05/19 22:04
主要讲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和height14 //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 @Override37 public void onClick(View arg0) {38 mywebView.loadUrl(URL);39 menuWindow.dismiss(); //响应点击事件之后关闭Menu40 }41 });42 mHelpbtn.setOnClickListener (new View.OnClickListener() {43 @Override44 public void onClick(View arg0) {45 mywebView.loadUrl(URL);46 menuWindow.dismiss(); //响应点击事件47 }48 });49 mHistorybtn.setOnClickListener (new View.OnClickListener() {50 @Override51 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已经打开 ,先关闭Menu68 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 @Override15 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 @Override22 public void onClick(View v) {23 // TODO Auto-generated method stub24 Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!", 25 Toast.LENGTH_SHORT).show(); 26 }27 });28 }29 30 @Override31 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 这个Activity42 } 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
- 弹出窗口的两种实现方式 PopupWindow 和 Activity
- 弹出窗口的两种实现方式 PopupWindow 和 Activity
- 弹出窗口的两种实现方式 PopupWindow 和 Activity
- 弹出窗口的两种实现方式 PopupWindow 和 Activity
- Android popupwindow 和 Activity弹出窗口实现方式
- android PopupWindow 和 Activity弹出窗口实现方式
- 使用PopupWindow和Activity两种不同的方式实现弹窗效果
- PopupWindow实现弹出窗口
- 弹出窗口两种方式
- android弹出窗口的实现(PopupWindow)
- android弹出窗口的实现(PopupWindow)
- android弹出窗口的实现(PopupWindow)
- android弹出窗口的实现(PopupWindow)
- android弹出窗口的实现(PopupWindow)
- android弹出窗口的实现(PopupWindow)!!!!
- Android弹出窗口的实现(PopupWindow)
- android弹出窗口的实现(PopupWindow)
- android弹出窗口的实现(PopupWindow)
- Unity学习笔记 2nd —— 摄像机那些事
- Jenkins系统设置
- 瓶颈ing
- UI标签在火狐浏览器中某些问题解决
- zblog主题 www.gridsmedia.com
- 弹出窗口的两种实现方式 PopupWindow 和 Activity
- Zblog开源项目菜鸟集成之路(一)
- POJ 1159 dp
- JAVA算法题练习---01_提取不重复的整数
- sql语句那些事-- 临时表
- 标签总介绍
- 数据结构实验之链表九:双向链表
- HDU 4802 GPA(水题)
- 先序遍历+中序遍历还原二叉树(二)