示例显示如何使用v7 appcompat库中的PopupMenu显示弹出式菜单。主界面使用V4支持库的ListFragment显示数据列表,当点击列表子项时,在子项下方弹出下拉菜单,并通过设置setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener())监听菜单点击事件,下拉菜单只有一个选项,用于移除该列表子项。

Demo下载地址:https://github.com/googlesamples/android-ActionBarCompat-ListPopupMenu/#readme

PopupMenu API:https://developer.android.google.cn/reference/android/support/v7/widget/PopupMenu

首先看看示例的运行界面:

   

Demo关键代码在Fragment中,主页面MainActiviy只是包含了Fragment,这里就不贴出来了:

public class PopupFragment extends ListFragment implements View.OnClickListener {

    @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); // 创建页面列表
ArrayList<String> items = new ArrayList<>();
for (int i = 0; i < Cheeses.CHEESES.length; i++) {
items.add(Cheeses.CHEESES[i]);
}
// 设置Adapter
setListAdapter(new PopupAdapter(items));
} @Override
public void onListItemClick(ListView l, View v, int position, long id) {
String item = (String) l.getItemAtPosition(position);
Toast.makeText(getActivity(), "Item Clicked: " + item, Toast.LENGTH_SHORT).show();
} @Override
public void onClick(final View v) {
// 为确保下拉菜单弹出位置的正确,需要传递一个Runnable对象。因为下拉菜单显示前,View的位置可能不一样(列表子项滚动位置会变)。
v.post(new Runnable() {
@Override
public void run() {
showPopupMenu(v);
}
});
} private void showPopupMenu(View view) {
final PopupAdapter adapter = (PopupAdapter) getListAdapter(); // 获得发生点击事件View的Tag
final String item = (String) view.getTag(); // 创建一个PopupMenu,并把PopupMenu绑定到对应的view
PopupMenu popup = new PopupMenu(getActivity(), view); // 为PopupMenu绑定布局文件
popup.getMenuInflater().inflate(R.menu.popup, popup.getMenu()); // 为下拉菜单设置监听
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.menu_remove:
// 把对应列表子项移除
adapter.remove(item);
return true;
}
return false;
}
}); // 显示下拉菜单
popup.show();
} class PopupAdapter extends ArrayAdapter { public PopupAdapter(ArrayList<String> items) {
super(getActivity(), R.layout.list_item, android.R.id.text1, items);
} @NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View view = super.getView(position, convertView, parent);
View popupButton = view.findViewById(R.id.button_popup);
popupButton.setTag(getItem(position));
popupButton.setOnClickListener(PopupFragment.this);
return view;
}
}
}

下拉菜单布局文件popup.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item
android:id="@+id/menu_remove"
android:title="remove" /> </menu>

列表子项布局文件list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?attr/listPreferredItemHeight"
android:orientation="horizontal"> <TextView
android:id="@android:id/text1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:textAppearance="?android:attr/textAppearanceMedium" /> <ImageView
android:id="@+id/button_popup"
android:layout_width="56dip"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground"
android:src="@mipmap/ic_action_settings" /> </LinearLayout>

Android Demo Android ActionBarCompat-ListPopupMenu的更多相关文章

  1. BNR Android Demo学习笔记(一)——CrimeIntent

    开发环境:win7,Android Studio 1.2, 1.Model Crime,数据模型,每个Crime有一个UUID作为唯一标识. package tina.criminalintent; ...

  2. LeadTools Android 入门教学——运行第一个Android Demo

    LeadTools 有很多Windows平台下的Demo,非常全面,但是目前开发手机应用的趋势也越来越明显,LeadTools也给大家提供了10个Android的Demo,这篇文章将会教你如何运行第一 ...

  3. 【Android】如何快速构建Android Demo

    [Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...

  4. 【Android Demo】悬浮窗体实现

    突然对悬浮窗体感兴趣,查资料做了个小Demo,效果是点击按钮后,关闭当前Activity,显示悬浮窗口,窗口可以拖动,双击后消失.效果图如下: 它的使用原理很简单,就是借用了WindowManager ...

  5. 制作Android Demo GIF:程序演示效果GIF图录制

    [转] 制作Android Demo GIF:程序演示效果GIF图录制   在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...

  6. Ubuntu TensorFlow 源码 Android Demo的编译运行

    Ubuntu TensorFlow 源码 Android Demo的编译运行 一. 安装 Android 的SDK和NDK SDK 配置 A:下载 国内下载地址选最新的: SDK: https://d ...

  7. YOLO2:实时目标检测视频教程,视频演示, Android Demo ,开源教学项目,论文。

    实时目标检测和分类 GIF 图: 视频截图: 论文: https://arxiv.org/pdf/1506.02640.pdf https://arxiv.org/pdf/1612.08242.pdf ...

  8. vs2017 android demo

    vs2017自安装以后就没怎么打开过,虽然12出的时候用10,15出的时候用13,17出的时候用15,但我依然坚持不用也装上再说的理念. 1.vs2017开发IOS和Android安装所必不可少的,u ...

  9. 【Android】Android开发初学者实现拨打电话的功能,拨打电话app小demo实现

    作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先先给大家看一下最终实现的效果: ...

随机推荐

  1. sql server 性能调优之 资源等待之网络I/O

    一.概述 与网络I/O相关的等待的主要是ASYNC_NETWORK_IO,是指当sql server返回数据结果集给客户端的时候,会先将结果集填充到输出缓存里(ouput cache),同时网络层会开 ...

  2. 谷歌浏览器中安装Axure扩展程序

    当使用谷歌浏览器预览Axure原型文件的时候,首次打开会出现以下界面: 我们按照图片中的步骤来即可,不过前提条件是翻.墙[我使用的是蓝灯,下载地址:https://github.com/getlant ...

  3. 微信小程序使用wxParse解析html

    最近项目上遇到在微信小程序里需要显示新闻内容,新闻内容是通过接口读取的服务器中的富文本内容,是html格式的,小程序默认是不支持html格式的内容显示的,那我们需要显示html内容的时候,就可以通过w ...

  4. leetcode — combinations

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...

  5. Python 实现 KNN(K-近邻)算法

    一.概述 KNN(K-最近邻)算法是相对比较简单的机器学习算法之一,它主要用于对事物进行分类.用比较官方的话来说就是:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例, ...

  6. mysql列反转Pivoting

    Pivoting是一项可以把行旋转为列的技术.在执行Pivoting的过程中可能会使用到聚合.Pivoting技术应用非常广泛.下面讨论的都是静态的Pivoting查询,即用户需要提前知道旋转的属性和 ...

  7. “多个单核CPU”与“单个多核CPU”哪种方式性能较强?

    多个单核CPU: 成本更高,因为每个CPU都需要一定的线路电路支持,这样对主板上布局布线极为不便.并且当运行多线程任务时,多线程间通信协同合作也是一个问题.依赖总线的传输,速度较慢,且每一个线程因为运 ...

  8. SpringBoot学习(七)-->SpringBoot在web开发中的配置

    SpringBoot在web开发中的配置 Web开发的自动配置类:在Maven Dependencies-->spring-boot-1.5.2.RELEASE.jar-->org.spr ...

  9. C# 委托 事件

    一:什么叫委托 通过反射发现,委托其实是一个类,继承自System.MulticastDelegate,但是System.MulticastDelegate这个类是特殊类,不能被继承 二:委托的声明 ...

  10. C# 显式转换关键字 explicit

    不同于隐式转换,显式转换运算符必须通过转换的方式来调用. 如果转换操作会导致异常或丢失信息,则应将其标记为 explicit. 这可阻止编译器静默调用可能产生意外后果的转换操作. 省略转换将导致编译时 ...