Android自定义PopupWindow简单小例子

下面是“Android自定义PopupWindow简单小例子”的完整攻略:

1. 什么是PopupWindow

PopupWindow是Android提供的一种UI组件,可以以浮层的方式展示一些内容,常见于下拉菜单、筛选框等场景。

2. 如何实现自定义PopupWindow

实现自定义的PopupWindow需要经过以下几个步骤:

2.1 创建自定义布局

首先,我们需要通过XML或者Java代码创建一个自定义布局,这个布局就是PopupWindow中展示的内容。可以使用任何Android支持的布局控件,如LinearLayout、RelativeLayout等。

例如,我们创建一个简单的布局文件popup_window_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="@android:color/white">

    <Button
        android:id="@+id/btn_pop_close"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Close PopupWindow" />

</LinearLayout>

这里我们使用了一个LinearLayout和一个Button控件,其中LinearLayout是根布局,Button是用于关闭PopupWindow的按钮。

2.2 创建PopupWindow对象

创建PopupWindow对象可以使用PopupWindow类提供的构造方法,常用的构造方法有三个:

PopupWindow(View contentView)
PopupWindow(View contentView, int width, int height)
PopupWindow(int width, int height)

其中,第一个构造方法只需要传入一个View对象,该View对象就是我们上一步中创建的自定义布局,其他两个构造方法还需要传入PopupWindow的宽度和高度。

例如,我们在MainActivity中创建一个PopupWindow对象mPopupWindow

private PopupWindow mPopupWindow;

private void initPopupWindow() {
    View popupView = LayoutInflater.from(this).inflate(R.layout.popup_window_layout, null);
    mPopupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    Button btnClose = popupView.findViewById(R.id.btn_pop_close);
    btnClose.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mPopupWindow.dismiss();
        }
    });
}

这里我们通过LayoutInflater创建了自定义布局,然后使用第二个构造方法创建了PopupWindow对象,并设置了宽度和高度为MATCH_PARENT和WRAP_CONTENT,表示PopupWindow的宽度占据整个屏幕,高度根据自定义布局自适应。最后,我们在自定义布局中找到关闭按钮,并设置点击事件,点击时关闭PopupWindow。

2.3 显示PopupWindow

显示PopupWindow有两种方法:

// 在指定的控件下方显示PopupWindow
popupWindow.showAsDropDown(View anchor)

// 在指定的位置显示PopupWindow
popupWindow.showAtLocation(View parent, int gravity, int x, int y)

其中,showAsDropDown()需要传入一个View对象作为锚点,表示PopupWindow显示在该View的下方,而showAtLocation()需要传入一个父布局View对象和PopupWindow显示的位置、偏移量等参数。

例如,我们在MainActivity的onCreate()方法中调用initPopupWindow()方法初始化PopupWindow,并在点击一个按钮时弹出PopupWindow:

private Button mBtnShow;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mBtnShow = findViewById(R.id.btn_show_popup);
    mBtnShow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mPopupWindow != null && !mPopupWindow.isShowing()) {
                mPopupWindow.showAtLocation(getWindow().getDecorView(), Gravity.CENTER, 0, 0);
            }
        }
    });

    initPopupWindow();
}

这里我们在初始化PopupWindow时设置了按钮的点击事件,点击时显示PopupWindow,并在屏幕中央显示。

3. 示例说明

3.1 实现一个下拉菜单

我们可以通过自定义PopupWindow实现下拉菜单的效果。例如,我们创建一个自定义布局dropdown_layout.xml,其中包括若干个条目:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="120dp"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="@android:color/white">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Item 1" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Item 2" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Item 3" />

</LinearLayout>

然后,在MainActivity中创建PopupWindow对象mDropDown,并在按钮点击事件中显示下拉菜单:

private PopupWindow mDropDown;

private void initDropDown() {
    View dropDownView = LayoutInflater.from(this).inflate(R.layout.dropdown_layout, null);
    mDropDown = new PopupWindow(dropDownView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    mDropDown.setBackgroundDrawable(new BitmapDrawable());
    mDropDown.setOutsideTouchable(true);

    // 处理点击条目事件
    dropDownView.findViewById(R.id.tv_item1).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mDropDown.dismiss();
            Toast.makeText(MainActivity.this, "Item 1 clicked", Toast.LENGTH_SHORT).show();
        }
    });
    dropDownView.findViewById(R.id.tv_item2).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mDropDown.dismiss();
            Toast.makeText(MainActivity.this, "Item 2 clicked", Toast.LENGTH_SHORT).show();
        }
    });
    dropDownView.findViewById(R.id.tv_item3).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mDropDown.dismiss();
            Toast.makeText(MainActivity.this, "Item 3 clicked", Toast.LENGTH_SHORT).show();
        }
    });
}

private void showDropDown() {
    if (mDropDown != null && !mDropDown.isShowing()) {
        mDropDown.showAsDropDown(mBtnDropDown);
    }
}

这里我们通过内部类实现了点击每个条目的回调,点击时关闭PopupWindow并弹出一个Toast提示。

在onCreate()方法中,我们初始化下拉菜单,并将按钮的点击事件绑定到showDropDown()方法上。

3.2 实现一个筛选框

我们可以通过自定义PopupWindow实现一个简单的筛选框。例如,在MainActivity中创建PopupWindow对象mFilter,并在按钮点击事件中显示指定的自定义布局:

private PopupWindow mFilter;

private void initFilter() {
    View filterView = LayoutInflater.from(this).inflate(R.layout.filter_layout, null);
    mFilter = new PopupWindow(filterView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    mFilter.setBackgroundDrawable(new BitmapDrawable());
    mFilter.setOutsideTouchable(true);

    // 处理点击事件
    filterView.findViewById(R.id.btn_filter_confirm).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mFilter.dismiss();
            Toast.makeText(MainActivity.this, "Filter confirmed", Toast.LENGTH_SHORT).show();
        }
    });
    filterView.findViewById(R.id.btn_filter_reset).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO: 重置筛选条件
            Toast.makeText(MainActivity.this, "Filter reset", Toast.LENGTH_SHORT).show();
        }
    });
}

private void showFilter() {
    if (mFilter != null && !mFilter.isShowing()) {
        mFilter.showAtLocation(getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);
    }
}

这里我们使用了带有确认按钮和重置按钮的自定义布局,点击确认按钮时关闭PopupWindow并弹出一个Toast提示,点击重置按钮时执行重置筛选条件的逻辑(这里仅仅是弹出一个Toast提示)。

在onCreate()方法中,我们初始化筛选框,并将按钮的点击事件绑定到showFilter()方法上。

以上就是“Android自定义PopupWindow简单小例子”中的完整攻略,希望能够对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android自定义PopupWindow简单小例子 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • Linux中用rename命令批量替换文件名方法实例

    下面是针对“Linux中用rename命令批量替换文件名方法实例”的完整攻略: 什么是rename命令 rename 命令是 Linux 系统下的一个非常强大的命令,它可以批量修改文件名,将文件名中的特定字符替换为指定的内容,或对文件名进行格式化等。在这里,我们主要介绍如何利用 rename 命令批量修改文件名。 rename命令格式 rename ‘旧字符…

    other 2023年6月26日
    00
  • 详解Java抽象类与普通类的区别

    下面我将详细讲解“详解Java抽象类与普通类的区别”,并提供两条示例说明。 什么是抽象类? 首先,我们来了解一下什么是抽象类。抽象类是一种特殊的类,它不能被实例化,只能作为其他类的父类被继承,子类必须实现其抽象方法才能被实例化。抽象类的关键字是“abstract”。 抽象类和普通类的区别 接下来,我们来看一下抽象类和普通类的区别,主要有以下几点: 实例化:抽…

    other 2023年6月27日
    00
  • Android提高Service优先级的方法分析

    Android提高Service优先级的方法分析 介绍 Service是Android中一种用于在后台执行长时间运行操作的组件。然而,默认情况下,Service在系统资源分配上的优先级相对较低,可能会受到系统资源紧张的影响。因此,当我们需要提高Service的优先级时,可以采取一些方法来实现。 本文将详细讲解Android提高Service优先级的方法,并提…

    other 2023年6月28日
    00
  • 如何禁止内部viewpager滑动

    当然,我很乐意为您提供有关“如何禁止内部ViewPager滑动”的完整攻略。以下是详细的步骤和两个示例: 1 如何禁止内部ViewPager滑动 在Android应用程序中,有时需要在一个ViewPager中嵌套另一个ViewPager。但是,有时您可能需要禁止内部ViewPager滑动。以下是实现此目的的步骤: 1.1 创建自定义ViewPager 首先,…

    other 2023年5月6日
    00
  • JS批量获取参数构建JSON参数对象

    下面是“JS批量获取参数构建JSON参数对象的完整攻略”,包括基本原理、实现方法和两个示例说明。 基本原理 在 JavaScript 中,可以使用对象字面量语法来创建 JSON 对象。要构建 JSON 参数对象,需要批量获取参数并将其存储到一个对象中。可以使用循环、条件语句等控制结构来实现这一目标。 实现方法 实现批量获取参数构建 JSON 参数对象可以按照…

    other 2023年5月5日
    00
  • python通过配置文件共享全局变量的实例

    Python通过配置文件共享全局变量的实例攻略 在Python中,可以通过配置文件来共享全局变量。这种方法可以让我们在不修改代码的情况下,根据需要动态地改变全局变量的值。下面是一个详细的攻略,包含了两个示例说明。 步骤1:创建配置文件 首先,我们需要创建一个配置文件,用于存储全局变量的值。配置文件可以使用常见的格式,如INI、JSON或YAML。在这个攻略中…

    other 2023年7月28日
    00
  • Android数据库相关整理

    Android数据库相关整理 Android作为目前最为流行的智能手机操作系统之一,其应用程序的数据存储涉及到SQLite、Room等多个数据库框架,针对这些框架的使用规范及优势劣势进行整理,提供给开发者更好的选择。 SQLite SQLite是Android内置的轻量级关系型数据库,是一种无需单独安装,即可直接使用的文件型数据库;由于其体积小、速度较快,被…

    其他 2023年3月28日
    00
  • python之mysqldb

    Python之MySQLdb MySQL是一种非常流行的关系型数据库,而Python是一种简单易学、但功能丰富的编程语言。而这两种技术的结合,可以让你轻松地在Python中操纵MySQL数据库。在Python中,应该使用MySQLdb模块来连接和操作MySQL数据库。 安装MySQLdb 在开始之前,我们要确保已经安装了Python并且已经安装了MySQL数…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部