Android UI 之 PopupWindow

本文详细介绍了PopupWindow的基本概念及其在Android应用中的实现方式。包括构造方法、设置窗体属性(如大小、位置、背景等)、响应触摸事件及监听窗体状态变化等。并通过两个示例展示了如何在Activity底部和指定View下方显示PopupWindow。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、PopupWindow的概述
PopupWindow弹出框,与Dialog有点相似,不同点在与PopupWindow可以选择显示的位置,以及窗体的大小
常用的方法
PopupWindow(View) 构造方法传递一个View的对象参数,这个View使用inflater动态加载布局的方式生成
setWidth(ViewGroup.LayoutParams.MATCH_PARENT)设置窗体宽度
setHeight(ViewGroup.LayoutParams.WRAP_CONTENT)设置窗体高度
setBackgroundDrawable(new ColorDrawable())设置窗体背景
setOutsideTouchable(true)设置窗体外部是否可触摸
setFocusable(true)设置窗体是否可以获取焦点
setTouchInterceptor()设置触摸事件
setOnDismissListener()当窗体调用dismiss方法时触发该监听事件
showAtLocation()设置窗体出现在布局的指定位置
showAsDropDown()设置窗体出现在指定View的相对位置

二、PopupWindow的实现

    private void  openNormalPop(){
        LayoutInflater inflater=LayoutInflater.from(this);
        View loginView= inflater.inflate(R.layout.login_dialog,null);
        pWindow=new PopupWindow(loginView);
        pWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        pWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        // 设置popupwindow不被键盘挡住
        pWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
        pWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

        pWindow.setBackgroundDrawable(new ColorDrawable());
//        pWindow.setOutsideTouchable(true);
        pWindow.setFocusable(true);
        setBackgroundAlpa(0.5f);

        pWindow.setTouchInterceptor(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction()==MotionEvent.ACTION_OUTSIDE){
                    pWindow.dismiss();
                    return true;
                }
                return false;
            }
        });
        pWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                setBackgroundAlpa(1f);
            }
        });

        RelativeLayout relativeLayout= (RelativeLayout) findViewById(R.id.relative);
        pWindow.showAtLocation(relativeLayout,Gravity.BOTTOM,0,0);
    }

以上代码简单的实现在Activity的下方弹出PopupWindow,其中提供了一个自定义的方法setBackgroundAlpa来设置显示PopupWindow时的整个屏幕除窗体以外的背景色,以及关闭了PopupWindow后恢复为原背景色的方法

    private void  opendownPop(){
        LayoutInflater inflater=LayoutInflater.from(PopupActivity.this);
        View loginView= inflater.inflate(R.layout.login_dialog,null);
        pWindow=new PopupWindow(loginView);
        pWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        pWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);

        pWindow.setBackgroundDrawable(new ColorDrawable());
        pWindow.setOutsideTouchable(true);
        pWindow.setFocusable(true);
        setBackgroundAlpa(0.5f);

        pWindow.setTouchInterceptor(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction()==MotionEvent.ACTION_OUTSIDE){
                    pWindow.dismiss();
                    return true;
                }
                return false;
            }
        });
        pWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                setBackgroundAlpa(1);
            }
        });
        pWindow.showAsDropDown(findViewById(R.id.btndropdown),0,0);
    }

以上方法是设置PopupWindow显现在按钮下(当然不仅仅是按钮,也可以是其他的View)
PopupWindow没有太多的深奥内容,主要是弹出PopupWindow时品屏幕背景色的变化的效果,并且PopupWindow的构造要传递一个动态加载布局的View

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值