Android 2.2 更改语言时的Bug

来源:互联网 发布:mosh 端口 编辑:程序博客网 时间:2024/06/06 15:00
    博客分类:
  • Android
AndroidD语言GitHTCXML

现象:Setting -> Language&Locale 设置后中文后,大部分应用程序及相关点都变为中文,但Launcher中所有项该是英文还是英文,Reboot后变为中亠。原因是Launcher中没有 做相应语言变更处理,做如下修改,添加消息注册函数,重新加载AllApps项!

enginer@root# git diff
src/com/android/launcher2/Launcher.java
     patch | blob | history
src/com/android/launcher2/LauncherModel.java
     patch | blob | history
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 84ee599..551a43e 100644 (file)
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -75,7 +75,8 @@
              android:stateNotNeeded="true"
              android:theme="@style/Theme"
              android:screenOrientation="nosensor"
-              android:windowSoftInputMode="stateUnspecified|adjustPan">
+             android:windowSoftInputMode="stateUnspecified|adjustPan"
+             android:configChanges="locale">
              <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
                  <category android:name="android.intent.category.HOME" />

diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 6bd915a..e333bc5 100644 (file)
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -2303,4 +2303,14 @@ public final class Launcher extends Activity
          mAllAppsGrid.dumpState();
          Log.d(TAG, "END launcher2 dump state");
      }
+
+     // Force reload all apps list when locale changes
+     @Override
+     public void onConfigurationChanged(Configuration newConfig) {
+         super.onConfigurationChanged(newConfig);
+         checkForLocaleChange();
+         mModel.setAllAppsLoaded(false);  // Set force load all apps list;
+         mModel.startLoader(this, true);  // Reload apps list
+     }
+
}
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 17f7573..4915466 100644 (file)
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -86,6 +86,11 @@ public class LauncherModel extends BroadcastReceiver {
      private Bitmap mDefaultIcon;
+     public void setAllAppsLoaded(boolean load)
+     {
+         mAllAppsLoaded = load;
+     }
+
      public interface Callbacks {
          public int getCurrentWorkspaceScreen();
          public void startBinding();

1.6calendar里,当系统语言改变时,calendar widget上的语言并没有随着改变。其实这个bugandroid的很多系统程序里都会出现。只要不是把string提取出来的,就都要响应“android.intent.action.CONFIGURATION_CHANGED”,为UI做一次update

这个bugHTCmagic上同样会出现。

1.6SDK里,“android.intent.action.CONFIGURATION_CHANGED”本来就是有bug的。网上居然没人讨论过这个问题。我们都知道,可以写一个broadcastReceiver来接受各种各样的Notification,但是,假如你的broadcastReceiverintentfilter里允许了接收CONFIGURATION_CHANGED,那好,你的这个AP里面就不能再接收其它的通告,要不然,在开机的时候会出现错误提示:你的程序没响应!

不仅如此,假如我接收了ACTION_CONFIGURATION_CHANGED ,但是我还想知道,这到底是由语言改变引起的呢?还是屏幕旋转了?会不是在extra里给出信息?

我追了一下源码,在ActivityManagerService.java,有方法updateConfigurationLocked,这里是系统发送通告的地方:

view source
print?
1Intent intent = newIntent(Intent.ACTION_CONFIGURATION_CHANGED);
2broadcastIntentLocked(null,null, intent, null, null,0, null,null,
3        null,false, false, MY_PID, Process.SYSTEM_UID);

是的,我无法知道是怎样的设置改变。

以上的讨论仅限于1.6,这一切在2.2SDK里不存在了!(1.62.2之间的SDK就没考证啦)

同时,在2.2里新加了一个通告:ACTION_CONFIGURATION_CHANGED,可以通过这个监听到系统语言改变。我也追了一下2.2的源码,在老地方:

view source
print?
01Intent intent = newIntent(Intent.ACTION_CONFIGURATION_CHANGED);
02intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
03        | Intent.FLAG_RECEIVER_REPLACE_PENDING);
04broadcastIntentLocked(null,null, intent, null, null,0, null,null,
05        null,false, false, MY_PID, Process.SYSTEM_UID);
06if((changes&ActivityInfo.CONFIG_LOCALE) !=0) {
07    broadcastIntentLocked(null,null,
08            newIntent(Intent.ACTION_LOCALE_CHANGED),
09            null,null, 0,null, null,
10            null,false, false, MY_PID, Process.SYSTEM_UID);
11}

froyo里,当系统语言改变时,会发出两个系统通告,分别是CONFIGURATION_CHANGEDACTION_LOCALE_CHANGED。

还的明确一点变动:2.2的ACTION_CONFIGURATION_CHANGED只能通过registerReceiver()才会被接收,manifest里写进去的作废了。

总结:

如何监听系统语言改变?如果是在activity,直接可以用onConfigurationChanged();如果是旧的SDK,只能接收CONFIGURATION_CHANGED,并且这个通告很不好用!在2.2里,ACTION_LOCALE_CHANGED is enough!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 车祸死者家属不来协商赔偿怎么办 26岁想回去当老师了怎么办 面包车排量小空调带不凉快怎么办 科三包过不给退钱人跑了怎么办 护师职称考试成绩单丢了怎么办 河南二级建造师报名地址填错怎么办 山东以前的企业没有消防备案怎么办 重庆渝北初级审核时间过了怎么办 初级职称复核毕业证弄丢了怎么办 杭州公租房选房后变更单位的怎么办 契税交了贷款办不下来怎么办 天津公租房住满5年后怎么办 大江里钓鱼水流太急立不住漂怎么办 房子定金交了不想要了怎么办 房子付了首付不想要了怎么办 三国大时代4王越死了任务怎么办 红米2卡顿反应慢怎么办 国税和地税合并新进的公务员怎么办 买车合格证不给我们要怎么办 初级会计报名信息表填写错误怎么办 跨国快递需要收件人自行清关怎么办 腋下有异味怎么办邀约成都真愛 腋下有异味怎么办犀利成都真愛 腋下有异味怎么办有信成都真愛 成都车牌网上选号次数用完了怎么办 在志愿服务中遇到突发状况怎么办 商铺没有房产证不能办理消防怎么办 亳州办事大厅登录密码忘记了怎么办 户口已迁出结婚证丢了怎么办 户口已迁出多年结婚证丢了怎么办 芜湖长信正式工没转正怎么办辞职 买到9个月库存车怎么办 买到5个月库存车怎么办 把4s店新车撞了怎么办 网址导航已取消打不开网页是怎么办 如果邦华手机充电口有杂物怎么办? 当发生灾害或突发事故时怎么办 物流信息和和收货地址不一样怎么办 小孩手被电梯门夹了怎么办 车管所50选一没看中的号码怎么办 长沙芙蓉区电动车被交警扣了怎么办