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;//屏蔽掉
}//这里就是问题的原因
}