【问题标题】:Android Studio - Include ResourceBundles in ModuleAndroid Studio - 在模块中包含 ResourceBundles
【发布时间】:2014-02-20 14:53:07
【问题描述】:

我目前从 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 和不同的路径尝试了很多不同的位置,但我会发疯,因为似乎没有任何效果。任何人都可以解释将这些捆绑包放在哪里以及如何加载它们吗?

谢谢!

【问题讨论】:

  • MyLibrary 正在使用 build.gradle 中的 java 插件?
  • 是的,它使用apply plugin: 'java'
  • src/main/java 是 Android-Gradle 目录约定; Java 插件可能不知道在那里寻找资源。
  • 那我应该把那些 ResourceBundles 放在哪里呢?尝试过MyLibrary/src/loc,但效果不佳。
  • 效果不佳 =/ "res.loc.Bundle""loc.Bundle""Bundle" 均无效。

标签: android-studio resourcebundle


【解决方案1】:

面临完全相同的问题。为了让它工作,我最终不得不在我的项目模块的主文件夹中创建一个资源文件夹。

此处以相同名称开头的多个文件(如该图中的消息)被捆绑为资源包。

最后不得不使用 ResourceBundle.getBundle("org.eclipse.paho.client.mqttv3.internal.nls.logcat") 或者 ResourceBundle.getBundle("org.eclipse.paho.client.mqttv3.internal.nls.messages") 获取所需的资源。

【讨论】:

  • 有效!我发现这个提示很有帮助:“可以通过上下文菜单(新建 > 文件夹 > Java 资源文件夹)创建这个资源文件夹。” stackoverflow.com/questions/29635462/…
  • 这可行,但实际上不需要创建新的资源文件夹,但现有文件夹可以作为资源文件夹包含在 build.gradle 中,请参阅我的 answer
【解决方案2】:

如果您将第二个项目作为库包含在内,您可能不想按照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中的资源目录。

【讨论】:

    【解决方案3】:

    我从未尝试过,但 Intellij 提供了非常好的资源包集成。

    参考这个链接

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

    从上面的链接

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

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

    您可以将这些文件放在您的模块中,也可以放在根目录下。

    【讨论】:

    • 您好,感谢您提供的信息。 Android Studio 正在识别这些文件,但我无法在 Java 中加载它们。无论我尝试什么,Android 都找不到它们。
    【解决方案4】:

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

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

    现在,如果您在类路径中找到资源文件夹,那么您可以简单地调用捆绑包的基本名称,在您的情况下为 ResourceBundle.getBundle("Bundle"),不需要完全限定的路径。假设您使用的是英语语言环境,它应该会找到它。如果需要,您可以进一步添加 en_US、en_NZ、en_GB 等。

    如果您没有找到您的属性文件夹,请确保它位于类路径中,如果您需要动态添加它,请遵循此线程。

    How do you change the CLASSPATH within Java?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2017-03-25
      • 2014-02-05
      • 1970-01-01
      • 2017-07-11
      • 2023-03-23
      相关资源
      最近更新 更多