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菜单的更多相关文章

  1. 自定义右键菜单,禁用浏览器自带的右键菜单[右键菜单实现--Demo]

    许多从事Web开发的会发现有些事,我们需要禁用浏览器本事自带的右键菜单,而实现自定义的右键菜单下面我们也来实现一个自定义的右键菜单 首先来创建JSP页面 <%@ page language=&q ...

  2. 【连载】Bootstrap开发漂亮的前端界面之自定义右键菜单

    连载: 1<教你用Bootstrap开发漂亮的前端界面> 2.<Bootstrap开发漂亮的前端界面之实现原理> 网页中的自定义右键菜单越来越普遍,自定义右键菜单可以增强用户体 ...

  3. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  4. SharePoint 2013 自定义扩展菜单

    在对SharePoint进行开发或者功能扩展的时候,经常需要对一些默认的菜单进行扩展,以使我们开发的东西更适合SharePoint本身的样式.SharePoint的各种功能菜单,像网站设置.Ribbo ...

  5. SharePoint 2013 自定义扩展菜单(二)

    接博文<SharePoint 2013 自定义扩展菜单>,多加了几个例子,方便大家理解. 例七 列表设置菜单扩展(listedit.aspx) 扩展效果 XML描述 <CustomA ...

  6. JavaScript自定义右键菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. SharePoint开发 - 自定义导航菜单(一)菜单声明与配置

    博客地址 http://blog.csdn.net/foxdave 本篇描述自定义sharepoint菜单的一种方式,自定义菜单适用于一些门户等需求的网站 自定义的菜单有自己的数据源,可以是数据表,可 ...

  8. jquery easyui鼠标右击显示自定义的菜单

    1.datagrid表格中,对某一行鼠标右击,显示出如下的自定义的菜单: 在html页面中写: <div id="menu" class="easyui-menu& ...

  9. 为SharePoint网站创建自定义导航菜单

    转:http://kaneboy.blog.51cto.com/1308893/397779 相信不少人都希望把SharePoint网站内置的那个顶部导航菜单,换成自己希望的样式.由于SharePoi ...

随机推荐

  1. CDH5.10 添加kafka服务

    简介: CDH的parcel包中是没有kafka的,kafka被剥离了出来,需要从新下载parcel包安装.或者在线安装,但是在线安装都很慢,这里使用下载parcel包离线安装的方式. PS:kafk ...

  2. Docker学习总结(一)—— namespace,cgroup机制

    1.namespace: Linux Namespaces机制提供一种资源隔离方案.PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace.每个 Namespace里 ...

  3. Linux tar命令高级用法——备份数据

    Linux tar命令高级用法——备份数据 2015-12-31 Linux学习 Linux上有功能强大的tar命令,tar最初是为了制作磁带备份(tape archive)而设计的,它的作用是把文件 ...

  4. js中Number()、parseInt()和parseFloat()的区别

    一:Number() 如果是Boolean值,true和false值将分别被转换为1和0. 如果是数字值,只是简单的传入和返回. 如果是null值,返回0. 如果是undefined,返回NaN. 如 ...

  5. Android屏幕适配方案——基于最小宽度(Smallest-width)限定符

    转自:https://www.cnblogs.com/error404/p/3815739.html 一.关于布局适配建议 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_ ...

  6. 随机森林(Random Forest,简称RF)

    阅读目录 1 什么是随机森林? 2 随机森林的特点 3 随机森林的相关基础知识 4 随机森林的生成 5 袋外错误率(oob error) 6 随机森林工作原理解释的一个简单例子 7 随机森林的Pyth ...

  7. vue+uwsgi+nginx部署项目

    首先先下载好前后端项目 先从前端vue搞起 要在服务器上,编译打包vue项目,必须得有node环境 下载node二进制包,此包已经包含node,不需要再编译 wget https://nodejs.o ...

  8. 使用AdBlock plus屏蔽广告

    使用前 使用后 定制规则 使用前 添加规则 id=1的为广告

  9. 在EXCEL中使用SQL语句查询

    SQL语句在数据库使用中十分重要. 在EXCEL中可以不打开工作簿,就获取数据,对多工作簿操作很用,也很快. 对大量数据处理,比循环快很多,但是比词典方法还有点距离(可惜我还没有学会词典). 对数据库 ...

  10. 自动删除 Elasticsearch 索引

    #!/bin/bash # author: Wang XiaoQiang# crontab -e# 0 0 * * * /root/script/del_esindex.sh # auto delet ...