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. Docker学习总结(二)—— 镜像,容器

    1.Docker镜像  1.1相关概念:registry :用于保存Docker镜像,包括镜像层次结构和镜像元数据,类似于git仓库之类的实体. repository:某个Docker镜像所有迭代版本 ...

  2. JAVA构造函数在超类与子类定义鲁波总结

    1.子类无构造函数,超类无构造函数,创建的无参数的对象: 编译通过. class A { } class B extends A { } public class Testeeer { public ...

  3. OD 实验(二十一) - 对反调试程序的逆向分析(二)

    程序: 运行程序 点击“Verify” 关闭该程序,启动 OD 再运行程序 逆向: 用 OD 载入程序 按 F8 往下走 执行完这个 call 指令就弹出了对话框 这个 call 指令调用了 Dial ...

  4. Setup FTP server on Ubuntu 14.04

    Setup FTP server on Ubuntu 14.04 Step 1 » Update repositories .krizna@leela:~$ sudo apt-get updateSt ...

  5. freebsd静态路由

    FreeBSD下增进静态路由的行动 1.手工添加 # route add -net 192.168.2.0/24 192.168.1.2 2. 通过rc.conf永世 设置 # Add static ...

  6. OpenLayers 3 之 切换图层控件

    OpenLayers 3 之 切换图层控件 openlayers 3中并没有默认的图层切换控件,GitHub中有一个项目实现了我们需要的控件-------- ol3-layerswitcher . 可 ...

  7. 「小程序JAVA实战」小程序头像图片上传(下)(45)

    转自:https://idig8.com/2018/09/09/xiaochengxujavashizhanxiaochengxutouxiangtupianshangchuan44/ 接下来,我们应 ...

  8. GitHub个人使用入门

    今天突然想起来了github 于是开始了入门之旅 如果你用过svn 那么你用起来感觉入门比较快的(至少我是这么感觉的)和在svn服务器上建项目的流程很像 每次修改代码之后提交的过程是: add, co ...

  9. kittle 使用心得

    1,字体编码格式: 解析excel表格时,出现乱码,两处修改:1, 2,

  10. <转>Linux环境进程间通信(五): 共享内存(上)

    http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写 ...