关于这个问题,网上有文章说如以下这样修改:
LocalePicker.java
final LocaleInfo[] localeInfos = new LocaleInfo[finalSize -1]; //将这里减1
for (int i = 0; i < finalSize -1; i++) { //将这里finalSize 减1
localeInfos[i] = preprocess[i];
("pishum","" + preprocess[i]);
}
如果真按这样修改,你会遇到这样的问题:
当你编译成eng(工程版本)时,一切正常,去掉了多出的开发者语言,但当编译成user版本,没有插入sim卡时,你会发现设置中的语言选项中少了一种语言,
比如,设置语言本来有英文和中文,这样修改后中文不见了,需插入sim卡后才会出现中文。说明这样修改是不完善的,而且是有问题的。
开发者语言顾名思义是给开发者开的,所以工程版本中是应该有这一种语言显示出来,而user版本才不应该有这种语言,要实现这样的需求,其实不用去去掉
finalSize数组的最后一个元素,可以如下修改:
同样在该类中,
String displayName = "";
if (s.equals("zz_ZZ")) {
if(isInDeveloperMode){ //在这里做一个判断,若是开发这模式,就添加该语言
displayName = "[Developer] Accented English";
Log.i(TAG,"isInDeveloperMode============" + isInDeveloperMode);
}
} else if (s.equals("zz_ZY")) {
displayName = "[Developer] Fake Bi-Directional";
} else {
displayName = toTitleCase(l.getDisplayLanguage(l));
}
if (DEBUG) {
Log.v(TAG, "adding "+displayName);
}
preprocess[finalSize++] = new LocaleInfo(displayName, l);
}
关于isInDeveloperMode变量,稍微解释一下,这个变量意思就是是否是开发这模式?
可以跟踪就在该类中还有这样一个方法
protected boolean isInDeveloperMode() {
return false;
}
但这个方法不能直接用在上面做判断条件,因为这个不是静态的,且不能把这个方法改为静态的,因为它要被
alps/packages/app/Settings/src/com/android/settings/LocalPicker.java类中的
@orerride
protected boolean isInDeveloperMode() {
final boolean showDev = getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE,
Context.MODE_PRIVATE).getBoolean(
DevelopmentSettings.PREF_SHOW,
android.os.Build.TYPE.equals("eng"));
return showDev;
}覆写。该类是继承自
alps/frameworks/base/core/java/com/android/internal/app/LocalPicker.java
而从这个方法能看到,当编译的版本为“eng” 即工程版本是,该方法返回值为true,即显示开发这语言。而若
为user版本,则这里会返回false,可以在这个方法内打应user的值看看:
final boolean notShowDev = getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE,
Context.MODE_PRIVATE).getBoolean(
DevelopmentSettings.PREF_SHOW,
android.os.Build.TYPE.equals("user"));
Log.e(TAG, "notShowDev==" + notShowDev);
当编译eng版本时notShowDev的值是false,也就是不显示开发这语言。
所以如此修改这个bug才算没什么sideeffect。