弹出窗口的两种实现方式 PopupWindow 和 Activity

来源:互联网 发布:公众号金钗网络 编辑:程序博客网 时间:2024/05/07 15:34

本人小菜一个。目前只见过两种弹出框的实现方式,第一种是最常见的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和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

View Code
 1 <?xml version="1.0" encoding="UTF-8"?> 2     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3         android:id="@+id/exit_layout" 4         android:layout_width="280dp" 5         android:layout_height="wrap_content" 6         android:gravity="center_horizontal" 7         android:orientation="vertical" 8         android:background="@drawable/confirm_dialog_bg2" > 9 10         <TextView11             android:layout_width="wrap_content"12             android:layout_height="wrap_content"13             android:layout_marginTop="4dp"14             android:padding="5dp"15             android:textColor="#333"16             android:textSize="20sp"17             android:text="退出微信" />18         19         <TextView20             android:layout_width="wrap_content"21             android:layout_height="wrap_content"22             android:textColor="#333"23             android:layout_marginTop="1dp"24             android:padding="10dp"25             android:textSize="16sp"26             android:gravity="center_horizontal"27             android:text="退出后,你将收不到新的消\n息.确定要退出?" /> 28         29 30         <LinearLayout31             android:layout_width="wrap_content"32             android:layout_height="wrap_content"           33             android:layout_marginTop="33dp"34             android:layout_marginBottom="8dp"35              >36             37             <Button38               android:id="@+id/exitBtn0"39               android:layout_width="110dp"40               android:layout_height="wrap_content"41               android:text="是"42               android:textSize="16sp"43               android:textColor="#fff"44               android:background="@drawable/btn_style_green"45               android:gravity="center"46               android:onClick="exitbutton0"47               />48             49             <Button50               android:id="@+id/exitBtn1"51               android:layout_width="110dp"52               android:layout_height="wrap_content"53               android:layout_marginLeft="10dp"54               android:text="否"55               android:textSize="16sp"56               android:textColor="#333"57               android:background="@drawable/btn_style_white"58               android:gravity="center"59               android:onClick="exitbutton1"60               />61         </LinearLayout>62 63     </LinearLayout>

 

分析,弹出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

 


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击