我正在开发一个活动检测测试用例,它使用Robotium框架自动验证AUT。我想要自动化几种语言测试。我试图通过从AUT中提取资源并将本地语言环境配置强制转换为其他语言来改变语言,但无济于事:
Locale locale = new Locale(lang);
Locale.setDefault(locale);
Configuration config = res.getConfiguration();
config.locale = locale;
res.updateConfiguration(config, res.getDisplayMetrics());
我也听说过以前可能会使用活动管理器使用ADB更改语言,但我一直无法找到V4.2.2的工作解决方案。如果没有在应用程序本身嵌入代码或生成设备,有没有办法通过Robotium或其他方式远程更改语言环境?
提前致谢
答案 0 :(得分:2)
前段时间我遇到过类似的问题,并提出了以下解决方案:
private void changeActivityLocale(final Activity a, String locale ){
Resources res = a.getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = new Locale(locale);
res.updateConfiguration(conf, dm);
a.getResources().updateConfiguration(conf, dm);
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
a.recreate();
}
});
}
在开始一些特定于语言环境的测试之前,我在我的测试用例中调用了这个方法。 希望它可以帮到你。
致以最诚挚的问候,
彼得
答案 1 :(得分:1)
protected void changeLocale(Locale locale)
throws ClassNotFoundException, SecurityException,
NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException,
NoSuchFieldException {
@SuppressWarnings("rawtypes")
Class amnClass = Class.forName("android.app.ActivityManagerNative");
Object amn = null;
Configuration config = null;
// amn = ActivityManagerNative.getDefault();
Method methodGetDefault = amnClass.getMethod("getDefault");
methodGetDefault.setAccessible(true);
amn = methodGetDefault.invoke(amnClass);
// config = amn.getConfiguration();
Method methodGetConfiguration = amnClass.getMethod("getConfiguration");
methodGetConfiguration.setAccessible(true);
config = (Configuration) methodGetConfiguration.invoke(amn);
// config.userSetLocale = true;
@SuppressWarnings("rawtypes")
Class configClass = config.getClass();
Field f = configClass.getField("userSetLocale");
f.setBoolean(config, true);
// set the locale to the new value
config.locale = locale;
// amn.updateConfiguration(config);
Method methodUpdateConfiguration = amnClass.getMethod(
"updateConfiguration", Configuration.class);
methodUpdateConfiguration.setAccessible(true);
methodUpdateConfiguration.invoke(amn, config);
}
您的申请需要获得许可:
android.permission.CHANGE_CONFIGURATION
对于api级别> = 17,您必须通过adb:
授予它adb shell pm grant application_package android.permission.CHANGE_CONFIGURATION