如何读取位于值文件夹中的文件

时间:2016-11-08 13:09:20

标签: android android-resources android-file

我想读完完整的string.xml文件,位于:src - >主要 - > res - >值。

为了论证,我需要特定的文件来处理我的应用程序中可能出现的一些本地化问题:比如选择的设备语言是法语,但是,我仍然需要主英语字符串中的一些值。 xml文件仅适用于特定方案。因此,values / strings.xml中的所有资源都应该存在于values-fr / strings.xml中,并从值-fr 中删除它们不是一个选项

  • 显然,这种解决方案 getString(R.string.text_name)是不可接受的,因为我们会从text_name文件收到values-fr/strings.xml的值,而不是values/strings.xml
  • 这也不会有帮助:

    getResources().getIdentifier("text_name", "string", getPackageName()); 
    
  • 这也不会有帮助,因为string.xml不是原始资产。 context.getResources().openRawResource(R.raw.test) context.getAssets().open("values/string.xml");

这是我尝试过的,但没有人给我提供我正在寻找的文件:

  1. 使用uri:

    Uri.parse("android.resource://" + context.getPackageName() + resource_id_for_string_file);
    
  2. 使用特定的文件路径,例如:

    File file = new File("/src/res/values/strings.xml");
    File file = new File("/res/values/strings.xml");
    
  3. 使用了this postclass.getClass().getResourceAsStream(...)),但也没有。

  4. 老实说,虽然它很容易,但我无法找到解决此问题的方法。

2 个答案:

答案 0 :(得分:1)

如果您想要一些英语文本,那么我建议您仅在法语string.xml文件中提及英语文本。它将仅从法语string.xml文件中自动使用英语。你不必明确地阅读它。或者,不要在法语string.xml文件中添加该值。它将直接从主string.xml文件中引用它。

答案 1 :(得分:0)

如果必须这样做,那么编写一个方法,将当前区域设置为美国时将应用程序的区域设置设置为(FR),然后调用getString(),它将从相关文件中获取值,然后恢复为最初选择的语言环境(在设置临时语言环境之前),这样你就可以使用相同的API方法,无需扭曲

public String getString(int id, Locale fromLocale, Context ctx){
    final Locale oldDefaultLocale = Locale.getDefault();

    Locale.setDefault(fromLocale);
    Configuration config = getBaseContext().getResources().getConfiguration();
    final Locale oldConfigLocale = config.locale;
    config.locale = fromLocale;
    ctx.getResources().updateConfiguration(config,
            getBaseContext().getResources().getDisplayMetrics());
    final String result = ctx.getString(id);

    Locale.setDefault(oldDefaultLocale);
    config.locale = oldConfigLocale;
    ctx.getResources().updateConfiguration(config,
            getBaseContext().getResources().getDisplayMetrics());

    return result;
}
在方法执行期间,

语言环境立即被更改/恢复 它不会影响屏幕上的其他视图/资源

如果将它放在父活动/片段中,则不必传递Context ctx,但如果在Util类或其他内容中,则需要传递它