自定义DropDownMenu菜单
在JayFang1993 / DropDownMenu的基础上进行修改,最后的到自己想要的效果
本来的效果:

而我最后实现的效果是:




我们先来分析一下DropDownMenu的源代码

需要改动的地方
1.Menu下面多了一个横线
2.点击变换按钮之后,按钮下面的横线以及字体,还有右边的arrow都变成红色,并且再次点击同一个menu,仍然是红色
解决横线问题
首先在menu_item中增加一个View
<View
android:id="@+id/menu_divider"
android:layout_width="35dp"
android:layout_height="4dp"
android:layout_alignLeft="@id/tv_menu_title"
android:layout_alignRight="@id/tv_menu_title"
android:layout_below="@id/tv_menu_title"
android:layout_centerHorizontal="true"
android:layout_marginTop="4dp"
android:background="@color/divider_menu"
android:visibility="invisible" />
在DropDownMenu修改
增加变量
private boolean mShowMenuDivider;
在init方法中设置mShowMenuDivider = true;
为了当Menu点击选项变化时,改变字体颜色和显示横线,我重写了OnMenuSelectedListener用于监听选择的主Menu改变事件,又增加了一个OnMenuItemSelectedListener监听器,用于监听Menu展开后的点击Item事件
public interface OnMenuSelectedListener {
public void OnMenuChanged(List<ImageView> mIvMenuArrow, View view, int nowRowIndex);
}
本来我没有加mIvMenuArrow这个参数的,后面会讲为什么增加这个参数
在MainActivity中实现OnMenuSelectedListener接口,重写onMenuChanged方法
观察以下代码
通过循环画出menu的选项页面,并调用监听方法
for (int i = 0; i < mMenuCount; i++) {
// final View menuDivider;
final RelativeLayout v = (RelativeLayout) LayoutInflater.from(
mContext).inflate(R.layout.menu_item, null, false);
// menuDivider = v.findViewById(R.id.menu_divider);
RelativeLayout.LayoutParams parms = new RelativeLayout.LayoutParams(
width / mMenuCount, LayoutParams.WRAP_CONTENT);
v.setLayoutParams(parms);
TextView tv = (TextView) v.findViewById(R.id.tv_menu_title);
tv.setTextColor(mMenuTitleTextColor);
tv.setTextSize(mMenuTitleTextSize);
if (mDefaultMenuTitle == null || mDefaultMenuTitle.length == 0) {
tv.setText(mMenuItems.get(i)[0]);
} else {
tv.setText(mDefaultMenuTitle[i]);
}
this.addView(v, i);
mTvMenuTitles.add(tv);
RelativeLayout rl = (RelativeLayout) v
.findViewById(R.id.rl_menu_head);
rl.setBackgroundColor(mMenuBackColor);
mRlMenuBacks.add(rl);
ImageView iv = (ImageView) v.findViewById(R.id.iv_menu_arrow);
mIvMenuArrow.add(iv);
mIvMenuArrow.get(i).setImageResource(mArrow.get(i).get("down"));
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) iv
.getLayoutParams();
params.leftMargin = mArrowMarginTitle;
iv.setLayoutParams(params);
final int index = i;
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Log.i("tanjin", "DropDwonMenu------->OnClick");
mMenuList.setAdapter(mMenuAdapters.get(index));
if (mMenuAdapters.get(index).getCount() > mShowCount) {
View childView = mMenuAdapters.get(index).getView(
0, null, mMenuList);
childView.measure(MeasureSpec.makeMeasureSpec(0,
MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0,
MeasureSpec.UNSPECIFIED));
RelativeLayout.LayoutParams parms = new RelativeLayout.LayoutParams(
LayoutParams.MATCH_PARENT, childView
.getMeasuredHeight() * mShowCount);
mMenuList.setLayoutParams(parms);
} else {
View childView = mMenuAdapters.get(index).getView(
0, null, mMenuList);
childView.measure(MeasureSpec.makeMeasureSpec(0,
MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0,
MeasureSpec.UNSPECIFIED));
RelativeLayout.LayoutParams parms = new RelativeLayout.LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT);
mMenuList.setLayoutParams(parms);
}
if (mMenuSelectedListener == null && isDebug)
Toast.makeText(mContext,
"MenuSelectedListener is null",
Toast.LENGTH_LONG).show();
else {
//调用监听方法
mMenuSelectedListener.OnMenuChanged(mIvMenuArrow,
view, index);
}
if (!mShowDivider) {
mMenuList.setDivider(null);
}
mMenuList.setBackgroundColor(mMenuListBackColor);
mColumnSelected = index;
mTvMenuTitles.get(index).setTextColor(
mMenuPressedTitleTextColor);
mRlMenuBacks.get(index).setBackgroundColor(
mMenuPressedBackColor);
mIvMenuArrow.get(index).setImageResource(
mArrow.get(index).get("up"));
mPopupWindow.showAsDropDown(v);
}
});
}
在Activity中设置监听器,并重写OnMenuChanged方法
menu.setMenuSelectedListener(new OnMenuSelectedListener() {
private ArrayList<Map<String, Integer>> mArrow = new ArrayList<>();
@Override
public void OnMenuChanged(List<ImageView> mIvMenuArrow, View view,
int nowRowIndex) {
// TODO Auto-generated method stub
Log.i("tanjin", "MainActivity------>OnMenuChanged");
for (int i = 0; i < menu.getChildCount(); i++) {
View v = menu.getChildAt(i);
v.findViewById(R.id.menu_divider).setVisibility(
View.INVISIBLE);
((TextView) v.findViewById(R.id.tv_menu_title))
.setTextColor(getResources().getColor(
R.color.default_menu_text));
if (i != nowRowIndex) {
mIvMenuArrow.get(i).setImageResource(
R.drawable.arrow_down);
}
}
menu.setmArrow(nowRowIndex);
view.findViewById(R.id.menu_divider)
.setVisibility(View.VISIBLE);
TextView tv = (TextView) view.findViewById(R.id.tv_menu_title);
tv.setTextColor(getResources().getColor(
R.color.default_menu_press_text));
Toast.makeText(CollectionActivity.this, " " + nowRowIndex,
Toast.LENGTH_SHORT).show();
}
});
自定义DropDownMenu菜单的更多相关文章
- 自定义右键菜单,禁用浏览器自带的右键菜单[右键菜单实现--Demo]
许多从事Web开发的会发现有些事,我们需要禁用浏览器本事自带的右键菜单,而实现自定义的右键菜单下面我们也来实现一个自定义的右键菜单 首先来创建JSP页面 <%@ page language=&q ...
- 【连载】Bootstrap开发漂亮的前端界面之自定义右键菜单
连载: 1<教你用Bootstrap开发漂亮的前端界面> 2.<Bootstrap开发漂亮的前端界面之实现原理> 网页中的自定义右键菜单越来越普遍,自定义右键菜单可以增强用户体 ...
- ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...
- SharePoint 2013 自定义扩展菜单
在对SharePoint进行开发或者功能扩展的时候,经常需要对一些默认的菜单进行扩展,以使我们开发的东西更适合SharePoint本身的样式.SharePoint的各种功能菜单,像网站设置.Ribbo ...
- SharePoint 2013 自定义扩展菜单(二)
接博文<SharePoint 2013 自定义扩展菜单>,多加了几个例子,方便大家理解. 例七 列表设置菜单扩展(listedit.aspx) 扩展效果 XML描述 <CustomA ...
- JavaScript自定义右键菜单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SharePoint开发 - 自定义导航菜单(一)菜单声明与配置
博客地址 http://blog.csdn.net/foxdave 本篇描述自定义sharepoint菜单的一种方式,自定义菜单适用于一些门户等需求的网站 自定义的菜单有自己的数据源,可以是数据表,可 ...
- jquery easyui鼠标右击显示自定义的菜单
1.datagrid表格中,对某一行鼠标右击,显示出如下的自定义的菜单: 在html页面中写: <div id="menu" class="easyui-menu& ...
- 为SharePoint网站创建自定义导航菜单
转:http://kaneboy.blog.51cto.com/1308893/397779 相信不少人都希望把SharePoint网站内置的那个顶部导航菜单,换成自己希望的样式.由于SharePoi ...
随机推荐
- Centos 6.5 下安装 Zabbix server 3.0服务器的安装及 监控主机的加入(2)
一.Centos 6.5 下的Zabbix Server安装 上篇文章记录的是centos 7 下安装zabbix ,很简单.但是6.5上面没有可用的源直接安装zabbix,所以需要从别处下载.感谢i ...
- Spring Boot自定义配置
一.方法 覆盖自动配置很简单,就当自动配置不存在,直接显式地写一段配置.这段显式配置的形式 不限, Spring支持的XML和Groovy形式配置都可以. 二.原理 @ConditionalOnMis ...
- h3c 云计算管理平台
- HTTP之Tcp/Ip协议的工作原理
计算机与网络设备要相互通信,双方就必须基于相同的方法.比如,如何探测到通信目标.由哪一边先发起通信.使用哪种语言进行通信.怎样结束通信等规则都需要事先确定.不同的硬件.操作系统之间的通信,所有的这一切 ...
- C#操作并口
http://www.doc88.com/p-2794713468912.html http://blog.csdn.net/pengqianhe/article/details/8021072 ht ...
- CentOS设置服务开机自动启动【转】
CentOS设置服务开机自动启动[转]Posted on 2012-06-28 16:00 eastson 阅读(4999) 评论(0) 编辑 收藏 CentOS安装好apache.mysql等服务器 ...
- .net core 下的Area注册
app.UseMvc(routes => { routes.MapAreaRoute( name: "AreaRoute", areaName: "Admin&qu ...
- Elasticsearch-PHP 快速开始
快速开始 本章节会给你一个客户端的主要功能(函数)是如何工作的快速概述. 安装 引入(包含)elasticsearch-php 在你的 composer.json 文件: { "requir ...
- 使用JavaScript调用aspx后台代码
方法1:js同步调用 触发: onclick="javascript:share('<%# Eval("id_File") %>')" 页面函数: ...
- SaltStack 的插件特性
:first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { border: 0; m ...