android 弹出式对话框实现自定义菜单栏

2023-10-27

第一步:创建菜单项实体类(Menu)

/**
 * 菜单栏选项类
 */
public class Menu {

	//标题
	private String title;
	
	//Id(图片Id)
	private int iconID;

	public Menu(String title, int iconID) {
		super();
		this.title = title;
		this.iconID = iconID;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public int getIconID() {
		return iconID;
	}

	public void setIconID(int iconID) {
		this.iconID = iconID;
	}
	
	
	
}


第二步:创建弹出式窗口类(自定义菜单栏)---CustomMenu

package com.demo.custommenu;

import java.util.List;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnKeyListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.LinearLayout.LayoutParams;


/**
 * 自定义弹出窗口继承PopupWindow
 */
public class CustomMenu extends PopupWindow {
    //封装GridView组件
	private GridView gvMenu;
    //封装View 组件
	private View view;
	
    /**
     * @param activity
     * @param menus
     */
    public CustomMenu(Activity activity, List<com.demo.custommenu.Menu> menus) {  
        super(activity); 
        //View 样式文件R.layout.menu
        view = activity.getLayoutInflater().inflate(R.layout.menu, null);  
        //实例化GridView组件
        gvMenu = (GridView)view.findViewById(R.id.gv_menu);
        
        //相关参数设置
        this.setContentView(view);  
        this.setWidth(LayoutParams.FILL_PARENT);  
        this.setHeight(LayoutParams.WRAP_CONTENT);
        
        //图片获取
        Drawable drawable = activity.getResources().getDrawable(R.drawable.selector_focused_shape); 
        //相关特效设置
        this.setBackgroundDrawable(drawable);
        this.setAnimationStyle(R.style.PopupAnimation);  
        this.setFocusable(true);
        
        //设置相关OnKeyListener事件
        gvMenu.setOnKeyListener(new OnKeyListener() {
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				if ((keyCode == KeyEvent.KEYCODE_MENU)&&(isShowing())) {  
					dismiss();//关闭PopupWindow弹出窗口
			        return true;  
			    }  
				return false;
			}
		});
        //自定义适配器--MenuAdapter
        adapter = new MenuAdapter(activity, menus);
        gvMenu.setAdapter(adapter);  
    }
    //GridView 为每个Item设置监听事件方法
    public void setMenuItemListener(OnItemClickListener menuClickListener) {
    	gvMenu.setOnItemClickListener(menuClickListener);  
    }
    
    
    
    private MenuAdapter adapter;
    
    public void dataUpdate() {
    	//数据设置进行相关的修改工作
    	adapter.notifyDataSetChanged();
    }
      
    /** 
     * 自定义适配器
     *  
     */  
    class MenuAdapter extends BaseAdapter {  
        
    	private List<Menu> menus;
    	
    	//自定义样式布局文件
    	private LayoutInflater layoutInflater;
    	
    	
    	
        /** 
         * ����TabMenu�ķ�ҳ���� 
         * @param context ���÷��������� 
         * @param texts ��ť���ϵ��ַ����� 
         * @param resID ��ť���ϵ�ͼ����Դ���� 
         * @param fontSize ��ť�����С 
         * @param color ��ť������ɫ 
         */  
        public MenuAdapter(Activity activity, List<Menu> menus) {  
            this.menus = menus;  
            layoutInflater = LayoutInflater.from(activity);
        }
        
        @Override
        public int getCount() {  
            return menus.size();  
        }  
        
        @Override
        public Object getItem(int position) {  
            return menus.get(position)  ;
        }  
        
        @Override
        public long getItemId(int position) {  
            return position;  
        }  
        
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {  
            MenuHolder holder = null;
            if(convertView==null) {
            	convertView = layoutInflater.inflate(R.layout.item_menu, null);
            	
            	holder = new MenuHolder();
            	holder.ivIcon = (ImageView)convertView.findViewById(R.id.iv_menu_item_icon);
            	holder.tvTitle = (TextView)convertView.findViewById(R.id.tv_menu_item_title);
            	
            	convertView.setTag(holder);
            }
            else { 
    			holder = (MenuHolder)convertView.getTag(); 
    		}
            
            holder.ivIcon.setImageResource(menus.get(position).getIconID());
            holder.tvTitle.setText(menus.get(position).getTitle());
        	return convertView;
        }
        
        class MenuHolder {
        	
        	/**
        	 * 图片组件
        	 */
        	public ImageView ivIcon;
        	
        	/**
        	 * 文本组件
        	 */
        	public TextView tvTitle;
        }
    }  
}


第三步:修改Activity样式文件------BasicActivity

package com.demo.custommenu;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;  
import android.os.Bundle;  
import android.view.Gravity;
import android.view.Menu;  
import android.widget.AdapterView.OnItemClickListener;  

public class BaseActivity extends Activity {
    //自定义弹出式菜单栏
    private CustomMenu customMenu;
    
    //样式组件
    private int parentViewID; 
    

    private List<com.demo.custommenu.Menu> menus; 
    
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        
        menus = new ArrayList<com.demo.custommenu.Menu>();

        
        customMenu = new CustomMenu(this, menus);
           
        
    }
    
    /**
     * �
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 弹出式对话框实现自定义菜单栏 的相关文章

  • 【java.lang.ref】PhantomReference & jdk.internal.ref.Cleaner

    目录 零 前情概要 ref包内容 系列目录 上一章回顾 一 PhantomReference 适用场景 优雅和提前规避 Java中使用native memory 常规做法 借助于Java引用机制 处理流程 二 jdk internal re
  • KETTLE 异常处理

    kettle未能正常执行任务时 同样需要记录下来执行操作 以便分析任务异常 红色线条代表任务异常时执行的任务 绿色为正常执行的任务序列 任务执行时都有日志记录 但kettle日志表中字段存在执行时间 但不存在业务日期字段 比如今天的任务执行
  • 第11节-PhotoShop基础课程-索套工具

    文章目录 前言 1 索套工具 选中后按Ctrl 可以移动 2 加 减 交叉 shift alt 2 多边形索套工具 手动首尾相连 或者双击空地 1 单击绘制直线选区 2 双击结束绘制 3 加 减 交叉 4 delete可以删除节点 3 磁性
  • MySQL数据管理

    一 外键的创建 方法1 在创建表的时候 增加约束 这个方法比较复杂麻烦 CREATE TABLE grade gradeid INT 10 NOT NULL AUTO INCREMENT COMMENT 年级id gradename VAR
  • 《计算机网络》谢希仁第七版课后答案完整版

    文章目录 第一章 概述 1 01 计算机网络向用户可以提供那些服务 1 02 简述分组交换的要点 1 03 试从多个方面比较电路交换 报文交换和分组交换的主要优缺点 1 04 为什么说因特网是自印刷术以来人类通信方面最大的变革 1 05 因
  • c语言——找零问题

    某人购买物品一共花了x元 x lt 100 用100元现金去支付 售货员需要找零 请设计程序给出一个找零方案 并使找零的张数最少 设现有人民币面值包括 100元 50元 20元 10元 5元 1元 5角和1角 当x包含1角以下的金额时 按照
  • Arduino基本知识

    1 程序结构 2 变量 局部变量和全局变量 3 调用Arduino的函数 4 通过点亮led IO设置为输出模式 学习pinMode 和digitalWrite 5 按键开关 IO设置为输入模式 6 初识赋值运算符和逻辑运算符 和布尔类型
  • uni-popup使用uni-grid显示错误问题

    在uni popup中 使用了uni grid 内部item显示错误 重叠 解决方式 为item设置style 比如我设置的列数是4 那么style中的width设置为25 item中的文字也需要设置宽度 否则文字方向不对 原因 暂时未知
  • c语言 教学目标,c语言选择结构程序设计教学目标

    c语言选择结构程序设计教学目标 选择结构程序设计 教学目标 能力要求 a 能够使用 if 语句编写条件选择程序 b 能够使用嵌套 if 语句和 switch 语句编写多分支选择结构程序 基础能力落实 1 判断一个数的正 负 输出相应信息 2
  • C++11 -- 类的新功能

    文章目录 类的新功能 默认成员函数 类成员变量初始化 强制生成默认函数的关键字default 禁止生成默认函数的关键字delete 继承和多态中的final和override关键字 类的新功能 默认成员函数 原来在C 类中 有6个默认成员函
  • 爬虫IP列表

    百度爬虫IP列表220 181 51 180 149 130 123 125 71 180 76 5 66google爬虫列表67 221 235 66 249 68 66 249 67 203 208 60 66 249 72 66 24
  • 目标检测中计算图像的交并比(IOU)

    交并比为目标检测中一个重要的概念 来进行预测框 ground truth 与标注框的重合率来对检测的正确率进行比较 图示如下 交并比计算公式 I O U C
  • 被攻击了使用高防服务器有用吗?业务放在高防服务器里面还会不会被攻击?

    高防服务器和无防服务器最大的区别就是在于防火墙 而且怎么样的防火墙可以防止攻击呢 防火墙是网络基础设施中用于网络安全的设备 是用于网络安全的第一道防线 高防防火墙是硬件组成 防火墙的作用是检查通过防火墙的数据包并根据预设的安全策略决定数据包
  • 云计算与大数据作业

    第一章 云计算 云计算的定义 维基百科 云计算是一种动态扩展的计算模式 通过计算机网络将虚拟化的资源作为服务提供给用户 什么是云计算 像水 电 煤 资源性产品 一样利用你的IT资源 计算机存储网络资源 关键词 按需使用 超大规模 高弹性 定
  • Pycharm社区版安装Django并完成Python入门到实践Django实验

    安装流程 首先 随便打开一个项目 然后在pycharm界面的左下角有Terminal终端的图标 点开 在命令行里进入想要的目录 我进的是cd C Users yasuo Desktop py 建立虚拟环境 在这个目录下输入python m
  • Intent见解

    今天做了一个很有意思的实验 三个程序的关系如图 1 先上3个代码 ActionAttr java文件 package org crazyit intent import android app Activity import android
  • 《深入剖析tomcat》读书笔记3--servlet容器

    主要是 深入剖析tomcat 的第五章和第十一章 个人觉得如下3点是关键 1 pipeline相关概念及其执行valve的顺序 2 standardwrapper的接受http请求时候的调用序列 3 standardwrapper基础阀加载
  • Redis 事务 - 监控测试

    Redis 基本事务操作 Redis事务本质 一组命令的集合 一个事务中的所有命令都会被序列化 在事务执行过程的中 会按照顺序执行 Redis事务是一组Redis命令的有序集合 这些命令在事务中按照顺序执行 但在事务执行过程中不会立即执行
  • Python之第十二章 处理Excel电子表格

    一 Excel文档 工作薄 xlsx文件 包含多个表 工作表 活动表 用户当前查看的表 关闭Excel前最后查看的表 二 安装openpyxl模块 import openpyxl 三 读取Excel表格 先制作一张例表1 xlsx 1 用o

随机推荐

  • Oracle数据库问题汇总

    Oracle自动维护任务 周日上午六点数据库报警 报ORA 1652错误 根据微信告警信息及告警时间点确认是Oracle自动维护任务启动 导致临时表空间不足 SQL Tuning Advisor这个自动任务很早就是要禁用掉的 本身数据库仅作
  • 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

    示例 1 输入 nums 1 2 3 1 输出 true 示例 2 输入 nums 1 2 3 4 输出 false 示例 3 输入 nums 1 1 1 3 3 4 3 2 4 2 输出 true 实现代码 public class So
  • new String和String直接赋值的区别

    栈区存引用和基本类型 不能存对象 而堆区存对象 是比较地址 equals 比较对象内容 在hotspot虚拟机中 jdk1 8之后 String常量池是在堆中的 单纯的String str aaa 是从虚拟机栈中的变量直接指向String常
  • 单点登录CAS学习(一):初识单点登录

    一 单点登录应用场景 不少业主单位随着自身的发展 建立不少业务支撑系统 往往会采用不同的开发商进行系统开发和建设 因此必然形成如下一种局面 工作人员需要登录多个业务系统才能将自己的工作全部完成 给工作人员带来了额外的负担 因此单点登录变应运
  • CentOS 6.9下的iptables在本机用DNAT转发指定IP到内网IP无效的问题解决(127.0.0.1)...

    比如 iptables t nat A OUTPUT p tcp d 192 168 1 0 24 dport 2222 j DNAT to destination 127 0 0 1 2222或者iptables t nat A OUTP
  • [个人笔记] Windows配置NTP时间同步

    Windows 运维篇 第六章 Windows配置NTP时间同步 Windows 运维篇 系列文章回顾 Windows配置NTP时间同步 域控环境的NTP配置 工作组环境的NTP配置 Windows的CMD部分命令集 参考来源 系列文章回顾
  • Angular表单实现双向数据绑定

    创建组件过程省略 实现双向数据绑定 要在app module中引入并声明 表单组件内容 import Component from angular core Component selector app form templateUrl f
  • mysql开启日志general_log

    general log会记录下发送给MySQL服务器的所有SQL记录 因为SQL的量大 默认是不开启的 一些特殊情况 如排除故障 可能需要临时开启一下 开启MySQL的general log MySQL有三个参数用于设置general lo
  • OBS直播画质怎么调?

    有用户在使用OBS软件直播时 发现直播的画质太差了 想要调高画质 但是却不知道如何调整 OBS参数设置教程 1 双击或者右击打开OBS软件 接着点击右下角箭头所指的设置选项 2 来到设置界面后 点击页面左侧的输出选项 3 在下图所示的输出页
  • Python学习总结1(知识+示例)

    学习环境 Ubuntu18 04系统 Geany编辑器 Python3 Pyhton3 安装 sudo add apt repository ppa fkrull deadsnakes sudo apt get update sudo ap
  • 故障注入测试(Fault Injection Test)评价类型说明

    这周新一篇技术文章来袭 上周我们对故障注入测试 Fault Injection Test 方法进行了初步的了解 本周要分享的技术文章是 故障注入测试 Fault Injection Test 评价类型说明 将针对故障注入测试进行更深层的说明
  • Linux 字符串截取方法

    八种截取方法 场景 var http www baidu com abc html 1 删除左边字符 保留右边字符 例 echo var 输出内容 www baidu com abc html 表示所有 获取变量var从左边遍历开始遇到的第
  • linux常用压缩、解压缩文件或文件夹命令tar、zip

    前言 工作中 压缩 解压缩文件或文件夹是比较基本的操作了 利用 tar或zip 命令可以把一大堆的文件和目录打包成一个文件 这对于备份文件或是将几个文件组合成为一个文件进行网络传输是非常有用的 tar压缩文件 tar 选项 源文件或目录 选
  • 微信支付接入

    目 录 第1章 微信支付接入 2 第2章 微信小程序申请微信支付 3 2 1 申请微信支付 3 2 2 微信审核 3 2 3 账户参数说明 4 第3章 微信公众号申请微信支付 5 3 1 支付申请 5 3 2 提交资料 6 3 3 填写商户
  • 多益网络校招前端面经(2020.09.24)

    多益网络校招前端面经 2020 09 24 面试平台 QQ视频通话 时长 大约半小时 过程 自我介绍 项目问题 项目中遇到的问题以及解决方式 在团队开发过程中个成员合作方式 遇到问题的解决方式 css命名冲突 http和https http
  • PyCharm使用教程(详细版 - 图文结合)

    目录 一 创建项目 二 运行 三 错误提示 四 安装三方包 PyCharm的使用贯穿整个Python的学习 所以单独拿出来出教程不合适 说多了对于新手来说也还是不明白 这里我们先从学习开始前大家需要用到PyCharm的一些功能讲起 后面的p
  • PHP实现用户登录注册(详细教程)

    教程前先给大家看看小编的实现成果吧 图1 图2 图3 教程 实现这个功能我们需要五个php文件 login php 登录界面 如图2
  • unity通过全局事件对项目进行解耦

    一个类要是想调用另一个类的方法 例如A想调用B的方法 方式一 引用 最简单的方式是A持有一个B类的引用 即A拥有一个B的成员对象 方式二 设计模式 中介者模式 或者A和B同属于一个对象C 通过对象C调用对方 中介者模式 例如QQ群 A和B互
  • 如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数 我发现将二维数组作参数进行传递还不是想象得那么简单里 但是最后我也解决了遇到的问题 所以这篇文章主要介绍如何处理二维数组当作参数传递的情况 希望大家不至于再在这上面浪费时间 正文 首先 我引
  • android 弹出式对话框实现自定义菜单栏

    第一步 创建菜单项实体类 Menu 菜单栏选项类 public class Menu 标题 private String title Id 图片Id private int iconID public Menu String title i