zoukankan      html  css  js  c++  java
  • 自定义DropDownMenu菜单

    JayFang1993 / DropDownMenu的基础上进行修改,最后的到自己想要的效果

    本来的效果:

    而我最后实现的效果是:

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

    需要改动的地方

    1.Menu下面多了一个横线

    2.点击变换按钮之后,按钮下面的横线以及字体,还有右边的arrow都变成红色,并且再次点击同一个menu,仍然是红色

    解决横线问题

    首先在menu_item中增加一个View

     1 <View
     2         android:id="@+id/menu_divider"
     3         android:layout_width="35dp"
     4         android:layout_height="4dp"
     5         android:layout_alignLeft="@id/tv_menu_title"
     6         android:layout_alignRight="@id/tv_menu_title"
     7         android:layout_below="@id/tv_menu_title"
     8         android:layout_centerHorizontal="true"
     9         android:layout_marginTop="4dp"
    10         android:background="@color/divider_menu"
    11         android:visibility="invisible" />

    在DropDownMenu修改

    增加变量

    1 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方法

     1 menu.setMenuSelectedListener(new OnMenuSelectedListener() {
     2 
     3             private ArrayList<Map<String, Integer>> mArrow = new ArrayList<>();
     4 
     5             @Override
     6             public void OnMenuChanged(List<ImageView> mIvMenuArrow, View view,
     7                     int nowRowIndex) {
     8                 // TODO Auto-generated method stub
     9                 Log.i("tanjin", "MainActivity------>OnMenuChanged");
    10                 for (int i = 0; i < menu.getChildCount(); i++) {
    11 
    12                     View v = menu.getChildAt(i);
    13                     v.findViewById(R.id.menu_divider).setVisibility(
    14                             View.INVISIBLE);
    15                     ((TextView) v.findViewById(R.id.tv_menu_title))
    16                             .setTextColor(getResources().getColor(
    17                                     R.color.default_menu_text));
    18                     if (i != nowRowIndex) {
    19                         mIvMenuArrow.get(i).setImageResource(
    20                                 R.drawable.arrow_down);
    21                     }
    22 
    23                 }
    24 
    25                 menu.setmArrow(nowRowIndex);
    26                 view.findViewById(R.id.menu_divider)
    27                         .setVisibility(View.VISIBLE);
    28                 TextView tv = (TextView) view.findViewById(R.id.tv_menu_title);
    29                 tv.setTextColor(getResources().getColor(
    30                         R.color.default_menu_press_text));
    31 
    32                 Toast.makeText(CollectionActivity.this, " " + nowRowIndex,
    33                         Toast.LENGTH_SHORT).show();
    34 
    35             }
    36         });
  • 相关阅读:
    Fegin参数使用总结
    navicat彻底卸载
    VM虚拟机win10无法联网,DNS配置问题
    Navicat15的安装及破解
    Docker 配置国内镜像源拉取prometheus,解决prometheus拉取特别慢的问题
    python中faker(生成随机数据)
    初探移动网站的架构和设计
    利用HTML5的一个重要特性 —— DeviceOrientation来实现手机网站上的摇一摇功能
    响应式Web设计(三):响应式Web设计的方法
    响应式Web设计(四):响应式Web设计的优化
  • 原文地址:https://www.cnblogs.com/six-moon/p/4959764.html
Copyright © 2011-2022 走看看