在Android中更改区域设置后应用程序找不到资源
Posted
技术标签:
【中文标题】在Android中更改区域设置后应用程序找不到资源【英文标题】:App not finding resources after locale change in Android 【发布时间】:2015-03-20 05:51:35 【问题描述】:我正在做一个需要即时更改语言的项目。我正在尝试设置所需的语言环境,但一旦我这样做,应用程序就会崩溃并抱怨它找不到资源(诸如 R.layout.* R.drawable.* 之类的东西)
这是我用来设置新语言环境的代码:
String languageToLoad = "es";
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
编辑:添加日志
E/androidRuntime: FATAL EXCEPTION: main java.lang.RuntimeException:无法启动活动 ComponentInfocom.flavorburst.mcdonalds/com.flavorburst.mcdonalds.MyActivity:android.view.InflateException:二进制 XML 文件第 25 行:膨胀类片段时出错 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5041) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 在 dalvik.system.NativeStart.main(本机方法) 原因:android.view.InflateException: Binary XML file line #25: Error inflating class fragment 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:489) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:396) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:352) 在 com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270) 在 android.app.Activity.setContentView(Activity.java:1881) 在 com.flavorburst.mcdonalds.MyActivity.onCreate(MyActivity.java:106) 在 android.app.Activity.performCreate(Activity.java:5104) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5041) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 在 dalvik.system.NativeStart.main(本机方法) 引起:android.content.res.Resources$NotFoundException:字符串数组资源 ID #0x7f08001e 在 android.content.res.Resources.getStringArray(Resources.java:451) 在 com.flavorburst.mcdonalds.NavigationDrawerFragment.onCreate(NavigationDrawerFragment.java:91) 在 android.app.Fragment.performCreate(Fragment.java:1673) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:854) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 在 android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1137) 在 android.app.Activity.onCreateView(Activity.java:4717) 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:489) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:396) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:352) 在 com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270) 在 android.app.Activity.setContentView(Activity.java:1881) 在 com.flavorburst.application.MyActivity.onCreate(MyActivity.java:106) 在 android.app.Activity.performCreate(Activity.java:5104) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5041) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 在 dalvik.system.NativeStart.main(Native Method)
【问题讨论】:
从 LogCat 发布堆栈跟踪信息。 根据您的日志,您的第 25 行的一个或多个资源文件 (strings.xml) 似乎存在问题。请检查此行。 我认为第 25 行是指它试图膨胀的布局,而不是字符串文件。 【参考方案1】:您是否尝试过清理和重建您的项目?如果您使用的是 Eclipse,请转到 Project -> Clean。然后再次构建。如果您使用的是 Android Studio 和 gradle,请在终端上键入以下命令行:
./gradlew clean
或
使用构建 -> 重建项目
【讨论】:
应用程序编译和启动正常。就好像在更改区域设置后,应用程序失去了对资源的引用。这是它在崩溃时吐出的错误的一个示例: Caused by: android.content.res.Resources$NotFoundException: String array resource ID #0x7f08001e @DanielJackson:仅供参考 - 应用程序不会丢失对资源的引用。也许您错误地定义了西班牙语(Locale "es")翻译文件。 我想您使用的是官方文档中建议的不同文件:developer.android.com/guide/topics/resources/… 对吗?即:res/drawable-es/ @AlexiosKarapetsas 我不需要语言的不同图像我只需要一些用不同语言完成的字符串文件,对于那些我将它们放在正确命名的文件夹中的文件,即:res/values-en,res/价值观-es @DanielJackson 你能发布片段类吗?我想可能存在初始化问题..【参考方案2】:这个错误:
Caused by: android.content.res.Resources$NotFoundException: String array resource ID #0x7f08001e at android.content.res.Resources.getStringArray(Resources.java:451) at com.flavorburst.mcdonalds.NavigationDrawerFragment
指的是您在其中一个 XML 文件中定义的字符串数组,但您忘记在 /values/array.xml
中创建字符串数组值。例如,在您的一个 XML 文件中,您可能指定了一个字符串数组值“arrayNames”,但您忘记在 /values/array.xml
中声明它,例如:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="arrayNames"/>
</resources>
因此,在运行时,编译器会抱怨在/values/array.xml
中找不到“arrayNames”。因此,您在运行应用程序时遇到的错误。
【讨论】:
做到了!我觉得自己有点像白痴。我必须确保任何/所有包含字符串、数组等的文件都在语言文件夹中。谢谢! 别担心,丹尼尔。很高兴我能帮助你。 ;)以上是关于在Android中更改区域设置后应用程序找不到资源的主要内容,如果未能解决你的问题,请参考以下文章
Gradle Android 构建项目错误:找不到元数据资源