【Android】ListPopupWindow

ListPopupWindow

ListPopupWindow简述

ListPopupWindow最低要求为api11,为了兼容到2.1, 可以使用包含在support V7包中实现。
从效果上来讲,ListPopupWindow就是一个弹出层的ListView,比较适合用来实现自定义的下拉菜单以及自定义的下拉选择列表。

ListPopupWindow的使用

自定义样式

一个示例:

<style name="V7.ListPopupWindowStyle" parent="@style/Widget.AppCompat.ListPopupWindow">
    <item name="android:popupBackground">#404040</item> //弹出层的背景
    <item name="android:dropDownVerticalOffset">0dip</item>
    <item name="android:dropDownHorizontalOffset">0dip</item> //水平以及垂直位移
    <item name="android:dropDownWidth">match_parent</item> //这个效果不大
</style>

<style name="V7.DropDownListViewStyle" parent="@style/Widget.AppCompat.ListView.DropDown">
    <item name="android:listSelector">@drawable/list_selector</item> //
    <item name="android:divider">#242424</item>
    <item name="android:dividerHeight">1px</item>

    ... //其他列表样式
tyle>

AppTheme是应用到Activity的主题
listPopupWindowStyle 对应弹出层的主题样式
dropDownListViewStyle 对应内含列表的主题样式,与普通ListView的定制方式一致

<style name="V7.ListPopupWindow" parent="AppTheme">
    <item name="listPopupWindowStyle">@style/V7.ListPopupWindowStyle</item>
    <item name="dropDownListViewStyle">@style/V7.DropDownListViewStyle</item>
</style>

代码调用

实现微信右上角弹出菜单,使用方式与PopupWindow差不多:

ListPopupWindow listPopupWindow = new ListPopupWindow(this);
listPopupWindow.setAnchorView(view);
listPopupWindow.setWidth(300); //如果不设置宽度的话,默认取AnchorView的宽度,一般不是我们想要的结果
listPopupWindow.setModal(true); //是否为模态,影响到对back按钮的处理
listPopupWindow.setAdapter(new ArrayAdapter<String>(this, R.layout.apt_v7_list_popup_window, R.id.apt_v7_tv, new String[]{
        "发起群聊",
        "添加朋友",
        "扫一扫",
        "意见反馈"
}));
listPopupWindow.show();

与PopMenu的对比

  1. PopMenu难以定制,ListPopupWindow的定制性更好
  2. ListPopupWindow不能自适应宽度
  3. PopMenu以面向菜单为核心,可以更方便的实现 禁用/开启 功能

一个让ListPopupWindow自适应宽度的方案,设置adapter后,检测每一行的最大宽度,然后再来设置 ListPopupWindow 的宽度,有利有弊,自己取舍了。

关于菜单那的其他实现方式:

  1. PopMenu
  2. PopupWindow + 自定义ContentView
  3. 页面内View + 自定义touch事件以及按键事件处理

demo

demo

Android分享 Q群:315658668

时间: 2024-12-16 19:20:59

【Android】ListPopupWindow的相关文章

【Android】Sqlite数据库增删改查

Android系统内置一个Sqlite数据库,如果app需要使用Sqlite数据库数据库存储数据,Android会为此app生成一个.db文件.这个数据库在data/data/<package_name>/databases里面,其中<package_name>为该安卓app的工程包名,这个目录必须root后才能看到.在Windows,单机的应用程序,存储数据,基本放到一个文件里面,正如游戏的存档,基本就是把当前的游戏状态存到一个用户很难找到的文件里面.每次存档读档就是一个从这个存

【Android】多个Activity之间利用bundle传递数值

安卓中的Activity相当于vb,mfc中的窗体,在多个Activity之间传递数据是一个相当核心的功能.下面举个例子来说明这个问题. 一.基本目标 用户在两个输入框中输入用户名.密码之后,跳到另一个Activity当中,显示其输入的内容, 然后这两个Activity能够轻松跳转. 二.制作过程 1.首先MainActivity的登录界面是沿用了<[Android]利用表格布局,Android中xml文件与java的交互制作登录界面>(点击打开链接)的布局,其布局文件activity_mai

【Android】自己定义View、画布Canvas与画笔Paint

安卓自己定义View事实上非常easy. 这个View能够像<[Android]利用Java代码布局,button加入点击事件>(点击打开链接)一样.利用Java代码生成一系列的组件. 也能够配合画布Canvas与画笔Paint来使用. 以下用一个样例来说明.例如以下图,有一个自己定义布局View.里面摆放着,利用画布Canvas与画笔Paint绘制出来的蓝色正方形与红色文字. 在res\layout\activity_main.xml中.直接像摆放安卓固有组件一样,能够直接使用这个我定义组件

【android】让popupwindow显示在view的上方并与该view水平居中对齐

首先,废话少说,先上效果图: 代码: public class MainActivity extends Activity implements OnClickListener{ private Button showBtn1; private Button showBtn2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV

【Android】-- adb shell 命令探索

ADB是什么,做android开发的没有不知道的. window下运行cmd,输入adb help就会打印adb都能够做的事情,包括 adb push ..adb pull .. adb devices  adb install... 等等..并且一搜一大把. 其中有一个命令叫做  adb shell,android是基于linux的,shell模式下linux的命令可是非常多的,android去掉了许多linux的命令,那么从这写命令里面又能够发现什么宝藏呢?寻宝之旅开启!! 首先linux的

【Android】与服务器实现JSON数据通信

一.前言 作为一名移动端开发人员,具备一定的服务端开发能力也是非常必要的,本篇博客讲述如何在Android和服务器之间实现JSON数据通信交互,博客内容基于另外一篇博客:[Web]Eclipse + Maven + Struts搭建服务器. 二.服务器端改造 在博客[Web]Eclipse + Maven + Struts搭建服务器中,我们实现了服务器的搭建,现在要做的事情就是让它返回的数据是一个JSON格式的,这样在获得请求的时候,我们才可以得到JSON数据,其配置改变如下. 首先我们新建一个

【Android】Could not find XXX.apk!的解决方法

昨天在Eclipse中导入一个Android工程后点击运行时出现了Could not find XXX.apk!的错误信息,具体错误提示如下: 到网上搜了好多方法,挨个尝试,最后都没解决但是,重启Eclipse居然好了,    观察发现在bin目录下没有apk文件,可能是因为工程没有完全编译通过无法生成apk,所以project-->clean,然后rebuild就可以了~ 另外可以手动导出无签名的apk然后在导入到模拟器中,对于如何将apk导入到模拟器中可以参考这篇文章: http://wan

【Android】Android中Service类onStartCommand的返回值有关问题(转)

@Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("---------->>onStartCommand2"); return super.onStartCommand(intent, flags, startId); } Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象

【Android】内嵌数据库IDE(可视化操作类)

Android开发的朋友应该对数据库内容的管理深有体会,想看一下放入数据库的内容都不是很方便,要么用root的设备导出来看或用第三方的手机版的ide.但是都要求root之后.最近一直在想android方便快捷的方法,今天刚好弄到了数据库这块.就写了一个Activity专门用来看数据库的,功能就是看对应数据库的表及表中的数据库. 效果图 刚写还没来得及美化,后面在使用过程中再时行完善. DBIDEActivity.java import java.util.ArrayList; import ja