• android 界面 状态栏按下 menu键 显示不出,无响应


    1.问题描述:


    在4.1的系统下,调试机器是768*1024的
    默认使得在launcher 是,状态栏显示menu键,但是按下menu键时却没有相应界面弹出,
    但是原来的机器:1024*600的就没有任何问题




    1)查找原因:
    launcher代码问题,通过不同的机器对比同样的代码,证明代码没有问题
    资源布局问题:强行走1024*600的布局,证明布局没有问题
    唯一区别代码尺寸不同,最后只能追查menu键按下的处理过程,最终确认原因。




    2)确认问题原因:


    menu键按下处理的关键:




    文件:
    PhoneWindow.java (frameworksasepolicysrccomandroidinternalpolicyimpl)


    按键按下后会走到一下的两个文件:


        public final boolean onKeyDownPanel(int featureId, KeyEvent event) {
    }
        public final void onKeyUpPanel(int featureId, KeyEvent event) {
         ...
         openPanel(st, event);
         ...
    }




        private void openPanel(PanelFeatureState st, KeyEvent event) {
            // System.out.println("Open panel: isOpen=" + st.isOpen);


            // Already open, return
            if (st.isOpen || isDestroyed()) {
                return;
            }


            // Don't open an options panel for honeycomb apps on xlarge devices.
            // (The app should be using an action bar for menu items.)
            if (st.featureId == FEATURE_OPTIONS_PANEL) {
                Context context = getContext();
                Configuration config = context.getResources().getConfiguration();
                boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) ==
                        Configuration.SCREENLAYOUT_SIZE_XLARGE;
                boolean isHoneycombApp = context.getApplicationInfo().targetSdkVersion >=
                        android.os.Build.VERSION_CODES.HONEYCOMB;


                if (isXLarge && isHoneycombApp) {
                    return;
                }//这里就是问题的原因
            }
               ...
    }


    3)//问题分析,条件有两个
    isXLarge 和 isHoneycombApp
    isXLarge 为真:
                boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) ==
                        Configuration.SCREENLAYOUT_SIZE_XLARGE;




    分析:文件:WindowManagerService.java (frameworksaseservicesjavacomandroidserverwm)


        private int reduceConfigLayout(int curLayout, int rotation, float density, int dw, int dh) {
         ...
            // configuration.  DO NOT CHANGE!
            if (longSize < 470) {
                // This is shorter than an HVGA normal density screen (which
                // is 480 pixels on its long side).
                screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_SMALL;
                screenLayoutLong = false;
                screenLayoutCompatNeeded = false;
            } else {
                // What size is this screen screen?
                if (longSize >= 960 && shortSize >= 720) {
                    // 1.5xVGA or larger screens at medium density are the point
                    // at which we consider it to be an extra large screen.
                    screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_XLARGE;//系统走的是这里,原因
                } else if (longSize >= 640 && shortSize >= 480) {
                    // VGA or larger screens at medium density are the point
                    // at which we consider it to be a large screen.
                    screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_LARGE;
                } else {
                    screenLayoutSize = Configuration.SCREENLAYOUT_SIZE_NORMAL;
                }
         ...
    }


    4)解决方法:在函数中屏蔽掉,问题解决,按menu键后弹出选项:
        private void openPanel(PanelFeatureState st, KeyEvent event) {
                if (isXLarge && isHoneycombApp) {
                    ;//return;//屏蔽掉
                }//这里就是问题的原因
    }
  • 相关阅读:
    maven编译时GBK错误
    生产环境中,通过域名映射ip切换工具SwitchHosts
    Java中的Filter过滤器
    Notepad++远程连接Linux系统
    MySQL 创建帐号和对表的导入导出
    XML 初识
    MySQL 字符集的设置
    C# 委托
    肖申克的救赎
    C#指针 常用手段
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744662.html
Copyright © 2020-2023  润新知