Android studio 之 弹窗PopupWindow

news/2024/5/17 16:32:44 标签: android studio, gitee, android

1.准备弹窗视图 popuop_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:background="#00ffff"
    android:padding="2dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">


    <TextView
        android:id="@+id/sele"
        android:layout_width="60dp"
        android:layout_height="30dp"
        android:background="#000000"
        android:textColor="#ffffff"
        android:gravity="center"
        android:text="选择" />

    <TextView
        android:id="@+id/all_sele"
        android:layout_width="60dp"
        android:layout_height="30dp"
        android:background="#000000"
        android:textColor="#ffffff"
        android:gravity="center"
        android:text="全选" />

    <TextView
        android:id="@+id/cope"
        android:layout_width="60dp"
        android:layout_height="30dp"
        android:background="#000000"
        android:textColor="#ffffff"
        android:gravity="center"
        android:text="复制" />
</LinearLayout>

2.添加一个按钮

 <Button
   android:id="@+id/popw_btn"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginTop="20dp"
   android:onClick="popAlert"
   android:text="PopupWindow 弹窗" />

3.在按钮的点击事件中设置弹窗

实例化 PopupWindow 对象

参数一 ,用在弹窗中的View(注意不是布局资源id,所以要根据布局资源id转换成view)

布局文件xml和视图之间的关系
  • 布局文件(.xml文件)定义了UI元素的结构和外观,而View对象则代表了布局中的一个具体的UI元素。 通过使用LayoutInflater类,我们可以将布局文件解析成一个View对象,然后将布局文件转换为实际可见的 UI 元素
  • 通过指定上下文(this)来获取当前上下文环境的LayoutInflater实例.
  • inflate(R.layout.popuop_layout, null)是LayoutInflater类的方法,它用于将布局文件R.layout.popuop_layout转换为一个View对象

参数二/三 长宽
参数四 是否获取焦点

//设置PopupWindow
    public void showPopupWindow(View anchorView){

        // 1.实例化 PopupWindow 对象
        /* 参数一 用在弹窗中的View(注意不是布局资源id,所以要根据布局资源id转换成view)
         * 参数二/三 长宽
         * 参数四 是否获取焦点*/
        // 1.1 准备弹窗需要的视图
        /* 根据 id = R.layout.popuop_layout 布局文件创建一个视图View,在 环境上下文 中使用*/
        /* 布局文件xml和视图之间的关系
         * 布局文件(.xml文件)定义了UI元素的结构和外观,而View对象则代表了布局中的一个具体的UI元素。
         * 通过使用LayoutInflater类,我们可以将布局文件解析成一个View对象,然后将布局文件转换为实际可见的 UI 元素
         * 通过指定上下文(this)来获取当前上下文环境的LayoutInflater实例
         * nflate(R.layout.popuop_layout, null)是LayoutInflater类的方法,它用于将布局文件R.layout.popuop_layout转换为一个View对象。*/
        View v = LayoutInflater.from(this).inflate(R.layout.popuop_layout,null);
        PopupWindow popupWindow = new PopupWindow(v,400,70,false);

        // 2.设置
        // 2.1 设置背景
        popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));// 透明色
        // 2.2 设置能响应外部的点击事件
        popupWindow.setOutsideTouchable(true);
        // 2.3 设置弹窗能响应点击事件
        popupWindow.setTouchable(true);
        // 2.4 为弹窗中的文本设计点击事件
        /* 一般设计点击事件需要用 findViewById() 去找到控件的id,从而找到控件,再为控件绑定点击事件
         * 但此时我们想要找的控件不在当前视图中,它在 R.layout.popuop_layout 布局中,所以我们要在由它创建的视图中找控件
         * 当前activity绑定的布局是 R.layout.activity_button */
        v.findViewById(R.id.sele).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ButtonActivity.this,"点击了选择",Toast.LENGTH_SHORT).show();
                popupWindow.dismiss();
            }
        });

        v.findViewById(R.id.all_sele).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ButtonActivity.this,"点击了全选",Toast.LENGTH_SHORT).show();
                popupWindow.dismiss();
            }
        });

        v.findViewById(R.id.cope).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ButtonActivity.this,"点击了复制",Toast.LENGTH_SHORT).show();
                popupWindow.dismiss();
            }
        });

        // 3.显示
        /* View anchor, int xoff, int yoff
         * 参数一 在哪里显示
         * x偏移
         * y偏移*/
        popupWindow.showAsDropDown(anchorView);

设置弹窗动画

创建动画资源

在res目录下新建 anim文件,新建动画资源

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

<!--  设置动画资源,此时是移动动画  -->
    <translate

        android:fromXDelta="-10dp"
        android:toXDelta="0dp"
        android:fromYDelta="-10dp"
        android:toYDelta="0dp"/>
</set>

创建风格,应用动画资源 - 打开values 下的 themesxml 文件,添加一下代码

<!--2.在风格里应用动画 -->
    <!-- popupStyle 的风格
         android:windowExitAnimation 窗口进入动画
     -->
    <style name="popupStyle">
        <item name="android:windowExitAnimation"> @anim/popup</item>
    </style>

为弹窗设置风格

 // 设置弹窗动画
        /* 1.创建动画资源 -- 先创建文件夹 再创建资源文件
         * 2.创建风格,应用动画资源
         * 3.将当前弹窗的的动画风格设置为第2步的风格 */
        popupWindow.setAnimationStyle(R.style.popupStyle);
//设置PopupWindow
    public void showPopupWindow(View anchorView){

        // 1.实例化 PopupWindow 对象
        /* 参数一 用在弹窗中的View(注意不是布局资源id,所以要根据布局资源id转换成view)
         * 参数二/三 长宽
         * 参数四 是否获取焦点*/
        // 1.1 准备弹窗需要的视图
        /* 根据 id = R.layout.popuop_layout 布局文件创建一个视图View,在 环境上下文 中使用*/
        /* 布局文件xml和视图之间的关系
         * 布局文件(.xml文件)定义了UI元素的结构和外观,而View对象则代表了布局中的一个具体的UI元素。
         * 通过使用LayoutInflater类,我们可以将布局文件解析成一个View对象,然后将布局文件转换为实际可见的 UI 元素
         * 通过指定上下文(this)来获取当前上下文环境的LayoutInflater实例
         * nflate(R.layout.popuop_layout, null)是LayoutInflater类的方法,它用于将布局文件R.layout.popuop_layout转换为一个View对象。*/
        View v = LayoutInflater.from(this).inflate(R.layout.popuop_layout,null);
        PopupWindow popupWindow = new PopupWindow(v,400,70,false);

        // 2.设置
        // 2.1 设置背景
        popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));// 透明色
        // 2.2 设置能响应外部的点击事件
        popupWindow.setOutsideTouchable(true);
        // 2.3 设置弹窗能响应点击事件
        popupWindow.setTouchable(true);
        // 2.4 为弹窗中的文本设计点击事件
        /* 一般设计点击事件需要用 findViewById() 去找到控件的id,从而找到控件,再为控件绑定点击事件
         * 但此时我们想要找的控件不在当前视图中,它在 R.layout.popuop_layout 布局中,所以我们要在由它创建的视图中找控件
         * 当前activity绑定的布局是 R.layout.activity_button */
        v.findViewById(R.id.sele).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ButtonActivity.this,"点击了选择",Toast.LENGTH_SHORT).show();
                popupWindow.dismiss();
            }
        });

        v.findViewById(R.id.all_sele).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ButtonActivity.this,"点击了全选",Toast.LENGTH_SHORT).show();
                popupWindow.dismiss();
            }
        });

        v.findViewById(R.id.cope).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ButtonActivity.this,"点击了复制",Toast.LENGTH_SHORT).show();
                popupWindow.dismiss();
            }
        });

        // 设置弹窗动画
        /* 1.创建动画资源 -- 先创建文件夹 再创建资源文件
         * 2.创建风格,应用动画资源
         * 3.将当前弹窗的的动画风格设置为第2步的风格 */
        popupWindow.setAnimationStyle(R.style.popupStyle);


        // 3.显示
        /* View anchor, int xoff, int yoff
         * 参数一 在哪里显示
         * x偏移
         * y偏移*/
        popupWindow.showAsDropDown(anchorView);
    }


http://www.niftyadmin.cn/n/5339692.html

相关文章

找不到mfc140u.dll,无法继续执行代码要怎么去解决?

当你尝试运行某些程序或游戏时&#xff0c;可能会遇到“msvcr110.dll丢失”的错误提示。这个错误通常表示你的系统缺少了msvcr110.dll文件&#xff0c;而这个文件是Microsoft Visual C 2012 Redistributable的一部分。在本文中&#xff0c;我们将介绍msvcr110.dll丢失的解决方法…

flutter项目怎么判断是不是web平台?Unsupported operation: Platform._operatingSystem

如果你使用Platform 这个工具来判断的时候&#xff0c;很有可能会报错&#xff1a; Exception caught by widgets library The following UnsupportedError was thrown building MyApp(dirty): Unsupported operation: Platform._operatingSystem The relevant error-causin…

Dell戴尔XPS 8930笔记本电脑原装Win10系统 恢复出厂预装OEM系统

链接&#xff1a;https://pan.baidu.com/s/1eaTQeX-LnPJwWt3fBJD8lg?pwdajy2 提取码&#xff1a;ajy2 原厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、MyDell等预装程序 文件格式&#xff1a;esd/wim/swm 安装方式&am…

web前端javascript笔记——(13)事件(1)

一、事件对象 鼠标/键盘属性 altKey 返回当事件被触发时&#xff0c;“ALT”是否被按下。 button 返回当事件被触发时&#xff0c;哪个鼠标按钮被点击 clientX 返回当事件被触发时&#xff0c;鼠标指针的水平坐标。 clientY …

java SSM政府采购管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM政府采购管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

3D模型格式转换工具HOOPS Exchange的层次结构遍历

这是两部分文章中的第一部分&#xff0c;我们将在其中开发一种通用算法&#xff0c;用于遍历 HOOPS Exchange 中实现的对象层次结构。遍历对象层次结构是几乎每个工作流程的重要且无处不在的部分。我们在这里描述的算法可以在Exchange Toolkit 中找到。 HOOPS Exchange 是一个…

Dubbo3在k8s下网卡地址注册时引发的问题

问题 在k8s host网络模式下&#xff0c;dubbo3在注册zk时&#xff0c;偶现注册地址IP来回变化的情况&#xff0c;有可能获取的是宿主机IP&#xff0c;有可能获取的是Docker的虚拟IP&#xff0c;host网络模式正常情况下&#xff0c;应该是获取宿主机IP&#xff0c;而不应该获取…

漏洞复现-SpringBlade export-user SQL 注入漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…