• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 自定义PopupWindow,popupwindow

自定义PopupWindow,popupwindow

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了自定义popupwindow,popupwindow,android popupwindow,popupwindow详解,popupwindow位置等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

自定义PopupWindow,popupwindow


 

PopupWindow,一个弹出窗口控件,可以用来显示任意View,而且会浮动在当前activity的顶部

自定义PopupWindow。

1.extends PopupWindow

2.构造方法中可以进行一些属性设置

 


setContentView(View convertView); //设置popupWindow显示的View

getContentView(); //获取popupWindow显示的view

setWidth(mWith); //设置popupWindow的宽度

setHeight(mHeight); //设置popupWindow的高度

设置宽高,也可以在构造方法那里指定好宽高, 除了可以写具体的值,还可以用WRAP_CONTENT或MATCH_PARENT, popupWindow的width和height属性直接和第一层View相对应。

setAnimationStyle(R.style.PopupAnimation); //设置弹出动画


 

setFocusable(true);

设置焦点,PopupWindow弹出后,所有的触屏和物理按键都由PopupWindows 处理。其他任何事件的响应都必须发生在PopupWindow消失之后,(home 等系统层面的事件除外)。 比如这样一个PopupWindow出现的时候,按back键首先是让PopupWindow消失,第二次按才是退出 activity,准确的说是想退出activity你得首先让PopupWindow消失,因为不并是任何情况下按back PopupWindow都会消失,必须在PopupWindow设置了背景的情况下。

而setFocusable(false); //PopUpWindow只是一个浮现在当前界面上的view而已,不影响当前界面的任何操作,是一个没有存在感的东西

一般情况下setFocusable(true);


setTouchable(true); // 设置popupwindow可点击


要让点击PopupWindow之外的地方PopupWindow消失:

1.setOutsideTouchable(true);

2.调用setBackgroundDrawable(new BitmapDrawable()); 设置背景,为了不影响样式,这个背景是空的。

除此之外,还可以这样写,setBackgroundDrawable(new ColorDrawable(0x00000000));背景不空,但是完全透明

经过实际检验,只要设置了背景,不管有没有设置setOutsideTouchable(true);即使设置了setOutsideTouchable(false);一样能够实现点击PopupWindow之外的地方PopupWindow消失,有点奇葩,不过为了保险起见,还是加上setOutsideTouchable(true);比较好。

 


PopupWindow还有一个方法,也是用来设置点击PopupWindow外部使得PopupWindow消失的,不过仅仅是实现这个方法是不行的,一样要设置背景才起作用。可是当设置了背景的时候,下面这个方法不管有没有用都能够实现点击PopupWindow外部使得PopupWindow消失,也是够醉。

setTouchInterceptor(new OnTouchListener() 
        {
            @Override
            public boolean onTouch(View v, MotionEvent event) 
            {
                if(event.getAction()==MotionEvent.ACTION_OUTSIDE)
                {
                    dismiss();
                    return true;
                }
                return false;
            }
        });

 


 

设置PopupWindow的弹出位置

popupWindow = new SelectPicPopupWindow(参数);

popupWindow.showAtLocation(findViewById(R.id.settings_layout),
     Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0);

 //在这里findViewById(R.id.settings_layout)是当前界面的id。


 

设置了PopupWindow的background,点击Back键或者点击弹窗的外部区域,弹窗就会dismiss.相反,如果不设置PopupWindow的background,那么点击back键和点击弹窗的外部区域,弹窗是不会消失的.

如果我想要一个效果,点击外部区域,弹窗不消失,但是点击事件会向下面的activity传递,比如下面是一个WebView,我想点击里面的链接等.

   /**
     * 点击外部区域,弹窗不消失,但是点击事件会向下面的activity传递,要给Window设置一个Flag,
    * WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
    * 看了源码,这个Flag的设置与否是由一个叫mNotTouchModal的字段控制,但是设置该字段的set方法被标记为@hide。
    * 所以要通过反射的方法调用:
     * Set whether this window is touch modal or if outside touches will be sent
     * to
     * other windows behind it.
     *
     */
    public static void setPopupWindowTouchModal(PopupWindow popupWindow,
            boolean touchModal) {
        if (null == popupWindow) {
            return;
        }
        Method method;
        try {

            method = PopupWindow.class.getDeclaredMethod("setTouchModal",
                    boolean.class);
            method.setAccessible(true);
            method.invoke(popupWindow, touchModal);

        }
        catch (Exception e) {
            e.printStackTrace();
        }

    }

 

然后调用setPopupWindowTouchModal(popupWindow, false);就可以了。

 


 不过还有要注意的是:

1.设置了setHeight();假如设置的高度小于屏幕的高,那么透明的那一部分是不属于PopupWindow的。

2.设置setContentView(View v);由于v里面的组件在布局文件里并没有占满整个屏幕,例如只是放在了底部,使得弹出PopupWindow上部分出现了透明,这个透明部分还是属于PopupWindow的,那么要想做到点击透明部分使得PopupWindow消失,又该怎么做呢?

这个也不难,答案如下:

/**
  *public class SelectPicPopupWindow extends PopupWindow
  */
private View popupView;

popupView = inflater.inflate(R.layout.popup_window, null);
this.setContentView(popupView);

popupView.setOnTouchListener(new OnTouchListener() {
            @SuppressLint("ClickableViewAccessibility")
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int height = popupView.findViewById(R.id.popup_layout).getHeight();
                int y = (int) event.getY();
                if(event.getAction() == MotionEvent.ACTION_UP){
                    if(y<height) {
                        dismiss();
                    }
                }
                return true;
            }
        });

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 自定义PopupWindow,popupwindow

相关文章

  • 2017-05-26ionic打包项目,运行时报错A problem occurred configuring root project &#39;android&#39;。。。,ionicconfiguring
  • 2017-05-26linux设备驱动程序之时钟管理(4)----原来是孩儿他爹娘
  • 2017-05-26Android Studio:Failed to resolve ***,androidresolve
  • 2017-05-26android:configChanges属性总结,
  • 2017-05-26第二个activity,启动第二个activity
  • 2017-05-26一款面试复习应用源码,面试复习源码
  • 2017-05-26Android 微信第三方登录(个人笔记),android第三方
  • 2017-05-26Android实现一个自定义相机的界面
  • 2017-05-26android的color整理(一),androidcolor整理
  • 2017-05-26android 自定义图片合集(自定义控件)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 我的android学习经历11,android学习经历11
    • React-Native系列Android——Touch事件原理及状态效果
    • 认识一下Kotlin语言 Android平台的Swift
    • 「视频直播技术详解」系列之六:现代播放器原理,
    • 张高兴的 Xamarin.Android 学习笔记:(四)常用控件,android常用控件
    • DroidPlugin插件化开发,droidplugin插件
    • Listview详解,listview
    • Cordova系列学习教程02 开发环境的准备和运行
    • Linux主机网络流量监控ifstat
    • 【同行说技术】Android程序员从小白到大神必读资料汇总(四),android资料汇总

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有