当前位置: 代码迷 >> Android >> 转:android Menu懂得
  详细解决方案

转:android Menu懂得

热度:106   发布时间:2016-05-01 16:59:55.0
转: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
  相关解决方案