修改反射PopupMenu宽度

object PopupMenuUtils {
    private lateinit var popupMenu: PopupMenu

    interface MenuItemClick : PopupMenu.OnMenuItemClickListener {
        override fun onMenuItemClick(item: MenuItem?): Boolean {
            return false
        }
    }

    @SuppressLint("RestrictedApi")
    fun showMenu(contentString: String, view: View, context: Context, menuRes: Int, listener: PopupMenu.OnMenuItemClickListener) {

        RxViewUtils.clicks(view, context).subscribe {
            //创建弹出式菜单对象(最低版本11)
            popupMenu = PopupMenu(context, view) //第二个参数是绑定的那个view
            //获取菜单填充器
            val inflater = popupMenu.menuInflater
            //填充菜单
            inflater.inflate(menuRes, popupMenu.menu)
            popupMenu.setOnMenuItemClickListener(listener)

            try {
                val mPopupHelper = popupMenu.javaClass.getDeclaredField("mPopup")

                mPopupHelper.isAccessible = true

                val mHelper = mPopupHelper[popupMenu] as MenuPopupHelper
                //不显示图标
                mHelper.setForceShowIcon(false)
                val standardMenuClass = Class.forName("android.support.v7.view.menu.StandardMenuPopup")
                // 设置不测量item宽度
                val mHasContentWidth = standardMenuClass.getDeclaredField("mHasContentWidth")
                mHasContentWidth.isAccessible = true
                mHasContentWidth.setBoolean(mHelper.popup, true)
                // 设置弹出框宽度
                val mContentWidth = standardMenuClass.getDeclaredField("mContentWidth")
                mContentWidth.isAccessible = true
                mContentWidth.setInt(mHelper.popup, DisplayUtil.getTextIntWidth(context, contentString+"哎哎哎", 14))
            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                popupMenu.show()
            }
        }

    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值