转:android Menu理解

学了较长时间的android. 有些东西都习以为常,不愿意去深究了.但是没深入理解并不代表它平凡,我记的刚接触android时候,书上就教我如何写Menu.  什么重载onCreateOptionsMenu等等.然后就按部对menu操作,哎.这个东西就出来了.

但是这些常用的功能都包含这较大的奥妙,说实话,这些常见的东西未必每个人都会,即使会写也未必知道他的来龙去脉,我的个性还是要深究,要深刻理解为什么这样.这样才能定植android,修改完善android.

那来吧,看我分析Menu

按下Menu键,是Menu键触发了这个功能,那我们得看看系统如何捕捉了这个Menu事件.如果你对android 事件传递机智不很清楚, 可以找我,我在公司讲课时候已经说的很清楚.如果从eventHub->windowMnaagerService->? 等.


这里不说消息传递,时间捕捉是在PhoneWIndow.java里的onKeyDOwnPanel函数,从这个函数捕捉到Menu后走会创建PanelFeatureState ,该类记录了当前Menu的状态信息,已经Menu的对象引用等.


然后进入了prepareMenu ,final Callback cb = getCallback();

if (cb != null) {
st.createdPanelView = cb.onCreatePanelView(st.featureId);
}
还是通过callback与activity来交互,此时我们发现onCreatePanelV iew返回了null.

if (st.createdPanelView == null) {
// Init the panel state's menu--return false if init failed
if (st.menu == null) {
if (!initializePanelMenu(st) || (st.menu == null)) {
return false;
}

这就很清楚了.如果用户没顶职view. 这系统默认是要显示Menu. 如何显示Menu呢?

final MenuBuilder menu = new MenuBuilder(getContext());

menu.setCallback(this);
st.setMenu(menu);
这个这就是以后我们需要add的那个Menu.

然后进入了onCreatePanelMenu这个东西是Activity.java 里的东西,看看他做了什么动作

onCreateOptionsMenu  哎.这才到了我们重载的这个东西.

前面这些相当与初始化,那什么时候真正显示Menu呢?

以为以前是onKeyDownpanle 是在用户按下Menu键的动作,但是你可以测试下,真诚出来的时候在在弹器的时候,
menu弹起做什么动作呢?

主要是显示了. // Show menu
openPanel(st, event);

关键是看openPanel 实现

st.decorView.addView(st.shownPanelView, lp);这句是把menu的内容加到panel里.

然后
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
WRAP_CONTENT, WRAP_CONTENT,
st.x, st.y, WindowManager.LayoutParams.TYPE_APPLICATION_PANEL,
WindowManager.LayoutParams.FLAG_DITHER
| WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
st.decorView.mDefaultOpacity);

lp.gravity = st.gravity;
lp.windowAnimations = st.windowAnimations;

wm.addView(st.decorView, lp);

通过windowMnaager把panel加到屏幕上.

恩,这样这个Menu就出来了,写blog不可能把每句代码都些出来,些这个估计大家都看的很清楚了.

http://www.wscxy.com/nuaa/article.asp?id=121
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值