4.0默认menu弹出实现研究

平台:android4.0
场景:刚步入android4.0,客户反馈launcher默认的弹出menu与2.3不一样,同时要求将menu的高度进行微调。
时间:2012.5.30

在2.3系统上,在launcher界面上点击menu按键,会弹出带有Icon的菜单栏。此时,在系统中使用的是IconMenuView。而在同样的场景下操作,在4.0系统上,弹出的是ListMenuView。
若在应用程序中重载了onCreateOptionsMenu()方法,则在点击menu按键的时候,将弹出ListMenu。关于Menu按键的默认响应,在PhoneWindow.java中进行了实现。
在PhoneWindow.java中,入口函数从onKeyUpPanel()开始:
onKeyUpPanel()====>openPanel()====>initializePanelContent()

在initializePanelContent()函数中,对最开始关于2.3和4.0的menu显示样式不同做出了解释:
MenuView menuView = st.isInListMode()
? st.getListMenuView(getContext(), mPanelMenuPresenterCallback)
: st.getIconMenuView(getContext(), mPanelMenuPresenterCallback);
将根据st.isInListMode()的返回来确定到底使用哪一种样式。同时此处的st变量是Menu显示的关键类PanelFeatureState的对象。PanelFeatureState为PhoneWindow.java的一个内部类。在其setStyle()方法中,设置了menu显示的相关参数。isCompact变量即与isInListMode()相关,其在4.0的默认主题Theme.Holo上,返回值是true,而2.3的默认主题Theme上,返回值为false。
这就是为什么4.0默认显示的menu为ListMenuView,而2.3默认显示为IconMenuView。
再仔细看看PanelFeatureState类,其中使用了MenuBuilder类的对象!此类即可理解为menu的行为控制类。而在PanelFeatureState的getListMenuView()方法中:
if (listMenuPresenter == null) {
listMenuPresenter = new ListMenuPresenter(
com.android.internal.R.layout.list_menu_item_layout, listPresenterTheme);
listMenuPresenter.setCallback(cb);
listMenuPresenter.setId(com.android.internal.R.id.list_menu_presenter);
menu.addMenuPresenter(listMenuPresenter);
}
menu的显示控制类呼之欲出—-ListMenuPresenter!而其相关的item的布局文件也出来了:R.layout.list_menu_item_layout。再看看ListMenuPresenter类,其中存在一个MenuAdapter。
OK,listview相关的内容出来了,就是它了。

解决方法:
此处要修改的是menu的默认高度,查看list_menu_item_layout.xml文件,其android:layout_height=”?android:attr/listPreferredItemHeightSmall”,
在themes.xml中默认使用的Theme.Holo主题中,找到listPreferredItemHeightSmall的item,修改为合适的dip即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值