Android Studio - 在模块中包含ResourceBundles

时间:2014-02-20 14:53:08

标签: android-studio resourcebundle

我目前从eclipse切换到android studio。在eclipse中我有2个项目,一个android应用程序项目和一个java项目,我将其作为库包含在android项目中。这个java项目使用ResourceBundles为它自己的错误创建国际化的错误消息。这是我的项目结构:

/MyApp
   /src
   /res
   ...
/MyLibrary
   /src
   /res (added as source folder to build path)
      /loc
         Bundle_en.properties 

这在加载RessourceBundles时起作用如下:

ResourceBundle.getBundle("loc.Bundle", Locale.ENGLISH);

现在我切换到android studio,我的新项目结构看起来像这样(将java库添加为模块):

/MyProject
   /MyApp
      ...
   /MyLibrary
      /src
         /main
            /java
               ...
            /res
               /loc
                  Bundle_en.properties   

但是我不能再加载ResourceBundles了,它只是抛出一个java.util.MissingResourceException。我为ResourceBundles和不同的路径尝试了很多不同的位置,但我会变得疯狂,因为似乎没有任何工作。任何人都可以解释在哪里放这些捆绑以及如何加载它们?

谢谢!

4 个答案:

答案 0 :(得分:9)

面临完全相同的问题。为了使它工作,我最终必须在我的项目模块的主文件夹中创建一个resorces文件夹。

Android resources folder

这里以同名开头的多个文件(如本图中的消息)被捆绑为资源包。

最后不得不用它来调用它 ResourceBundle.getBundle(" org.eclipse.paho.client.mqttv3.internal.nls.logcat&#34) 要么 ResourceBundle.getBundle(" org.eclipse.paho.client.mqttv3.internal.nls.messages&#34) 获得所需的资源。

答案 1 :(得分:1)

如果将第二个项目包含为库,则可能不希望按照previous answer中的建议创建新的资源文件夹(这确实有效)。相反,您只需将库的资源文件夹添加到模块build.gradle中的资源目录中:添加到android部分

sourceSets {
    main.resources.srcDirs += 'path/to/your/libs/res'
}

如果现在添加的res文件夹包含org/mypackage/Bundle.properties,您可以使用

引用它
ResourceBundle.getBundle("org.mypackage.Bundle")

实际上添加新的资源文件夹只会将其添加为build.gradle中的资源目录。

答案 2 :(得分:0)

我从未尝试过,但Intellij非常好地整合了资源包。

参考此链接

http://www.jetbrains.com/idea/webhelp/resource-bundle.html

从上面的链接

  

资源包是一组具有相同基本名称的属性文件   具有不同的语言特定后缀。资源包包含   例如,至少有两个具有相似基本名称的属性文件   file_en.properties和file_de.properties。

     

IntelliJ IDEA可识别属性文件,如果有两个或更多   名称仅以后缀不同的属性文件是   遇到了,将它们连接到资源包中。新节点资源   Bundle'(基本名称)'出现在项目工具窗口中:

resource Bundles

您可以将这些文件放在模块内或root上。

答案 3 :(得分:0)

首先请确保您的资源文件夹(属性文件所在的位置)位于类路径中,您可以通过调用以下内容轻松找到它。

 URLClassLoader ldr = (URLClassLoader)ClassLoader.getSystemClassLoader();
 URL[] urls = ldr.getURLs();
 for(URL url : urls)
   {
      System.out.println(url.getPath());
    }

现在,如果在类路径中找到资源文件夹,那么您只需调用bundle base name,在您的情况下为ResourceBundle.getBundle(“Bundle”),不需要完全限定的路径。假设您正在使用英语语言环境,它应该找到它。如果需要,您可以进一步添加en_US,en_NZ,en_GB等。

如果找不到属性文件夹,请确保它位于类路径中,如果需要动态添加,请按照此主题进行操作。

How do you change the CLASSPATH within Java?

记住动态加载属性文件的唯一补充是你必须在类加载器上调用findResource或findResources API来加载属性文件。希望这会有所帮助。