zoukankan      html  css  js  c++  java
  • 弹出窗口的两种实现方式 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

    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         <TextView
    11             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         <TextView
    20             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         <LinearLayout
    31             android:layout_width="wrap_content"
    32             android:layout_height="wrap_content"           
    33             android:layout_marginTop="33dp"
    34             android:layout_marginBottom="8dp"
    35              >
    36             
    37             <Button
    38               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             <Button
    50               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

  • 相关阅读:
    远程桌面无法复制粘贴
    正则表达式(http://tieba.baidu.com/p/882391125)
    android 2048游戏、kotlin应用、跑马灯、动画源码
    Android扫码二维码、美女瀑布流、知乎网易音乐、动画源码等
    android狼人杀源码,桌面源码,猎豹快切源码
    android文件管理器源码、斗鱼直播源码、企业级erp源码等
    android动画源码合集、动态主题框架、社交app源码等
    android下载管理、理财、浏览器、商品筛选、录音源码等
    android手机安全卫士、Kotlin漫画、支付宝动画、沉浸状态栏等源码
    android企业级商城源码、360°全景图VR源码、全民直播源码等
  • 原文地址:https://www.cnblogs.com/winxiang/p/2778729.html
Copyright © 2011-2022 走看看