学了较长时间的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