- Resources
res = getResources(); - Configuration
config = res.getConfiguration(); - config.locale
= locale; - DisplayMetrics
dm = res.getDisplayMetrics(); - res.updateConfiguration(config,
dm);
前两种方法的原理即在应用里实现“选择语言”。通过查看源码,其核心代码为:
- IActivityManager
iActMag = ActivityManagerNative.getDefault(); - try
{ -
Configuration config = iActMag.getConfiguration(); -
config.locale = locale; -
// 此处需要声明权限:android.permission.CHANGE_CONFIGURATION -
// 会重新调用 onCreate(); -
iActMag.updateConfiguration(config); - }
catch (RemoteException e) { -
e.printStackTrace(); - }
- PS:感谢
曾阳 的帮助。
代码:
- ActivityManagerNative.java
- package
android.app; -
-
- public
abstract class ActivityManagerNative { -
public static IActivityManager getDefault() { -
return null; -
} - }
-
- IActivityManager.java
- package
android.app; -
- import
android.content.res.Configuration; - import
android.os.RemoteException; -
-
- public
abstract interface IActivityManager { -
public abstract Configuration getConfiguration() throws RemoteException; -
-
public abstract void updateConfiguration(Configuration paramConfiguration) -
throws RemoteException; - }
- private
void updateLanguage(Locale locale) { -
Log.d("ANDROID_LAB", locale.toString()); -
try { -
Object objIActMag, objActMagNative; -
Class clzIActMag = Class.forName("android.app.IActivityManager"); -
Class clzActMagNative = Class.forName("android.app.ActivityManagerNative"); -
Method mtdActMagNative$getDefault = clzActMagNative.getDeclaredMethod("getDefault"); -
// IActivityManager iActMag = ActivityManagerNative.getDefault(); -
objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative); -
// Configuration config = iActMag.getConfiguration(); -
Method mtdIActMag$getConfiguration = clzIActMag.getDeclaredMethod("getConfiguration"); -
Configuration config = (Configuration) mtdIActMag$getConfiguration.invoke(objIActMag); -
config.locale = locale; -
// iActMag.updateConfiguration(config); -
// 此处需要声明权限:android.permission.CHANGE_CONFIGURATION -
// 会重新调用 onCreate(); -
Class[] clzParams = { Configuration.class }; -
Method mtdIActMag$updateConfiguration = clzIActMag.getDeclaredMethod( -
"updateConfiguration", clzParams); -
mtdIActMag$updateConfiguration.invoke(objIActMag, config); -
} catch (Exception e) { -
e.printStackTrace(); -
} - }
- <</span>string
name="app_name">语言应用</</span>string>
- public
static final class string { -
public static final int app_name=0x7f050001; - }
- Resources
res = context.getResources(); - String
pkg = context.getPackageName(); - String
tag = "app_name"; - int
idTag = res.getIdentifier(tag, "string", pkg);