【问题标题】:Is it possible to do string substitution in Android resource XML files directly?是否可以直接在 Android 资源 XML 文件中进行字符串替换?
【发布时间】:2011-10-04 12:05:50
【问题描述】:

在我的 android 应用程序中,我有一个大的字符串资源 xml 文件。我想在字符串值中引用和重用声明的资源值。是否可以让 R 类解析引用的值(例如 @string/db_table_name)?

<resources>
<string name="db_table_name">tbl_name</string>
<string name="ddl">create table @string/tbl_name</string>
</resources>

有没有办法做到这一点。在常规 Java 世界中,一些工具使用 ${varname} 表达式来解析引用。这完全可以在 Android 中完成吗?

【问题讨论】:

  • 您可能不需要 xml 资源中的数据库命名和查询创建内容,并且它们不会依赖于本地化或设备限定符 - 我会投票赞成在全局项目配置文件中包含这些内容,也许用于查询创建的静态类 - 只是一个想法!我不知道以上可能是 res 文件 :)

标签: android android-resources


【解决方案1】:

嗯,我认为这是不可能的。因为一旦分配了资源,android 将不允许我们在空中动态更改它们。相反,您可以尝试将字符串放在单独的类中,并在运行代码时更改它们。

【讨论】:

  • 我对在运行时更改字符串不感兴趣,而是让创建 R.java 类的 Android 代码生成在设计时代替我。显然是不可能的。
【解决方案2】:

将 %s 添加到您希望修改的第二个资源字符串(您希望成为动态的那个)。即,

<resources>
<string name="db_table_name">tbl_name</string>
<string name="ddl">create table %s</string>
</resources>

并在您的代码中使用 getString() 来发挥作用,

getString(R.string.ddl, getString(R.string.db_table_name));

【讨论】:

  • 我知道这种方法。我想知道生成 R.java 时 Android 工具是否会执行此操作。使用建议的答案仍然需要我完成所有工作。
【解决方案3】:

确实有可能。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
  <!ENTITY appname "MyAppName">
  <!ENTITY author "MrGreen">
]>

<resources>
    <string name="app_name">&appname;</string>
    <string name="description">The &appname; app was created by &author;</string>
</resources>

您甚至可以全局定义您的实体,例如:

res/raw/entities.ent:

  <!ENTITY appname "MyAppName">
  <!ENTITY author "MrGreen">

res/values/string.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY % ents SYSTEM "./res/raw/entities.ent">
    %ents;   
]>

<resources>
    <string name="app_name">&appname;</string>
    <string name="description">The &appname; app was created by &author;</string>
</resources>

【讨论】:

  • 嗨,我试过这个并得到“未解析的实体引用”我的路径是“/raw/entities/ent”,因为当我将路径设置为与示例中所写的相同时,一切都是标记为红色,我得到“找不到资源”
  • 我得到:错误:实体“appname”被引用,但未声明。我完全喜欢这个例子,但可以让它工作......
  • 这个解决方案实际上对我不起作用:请参阅我的问题:stackoverflow.com/questions/50933985/…
  • @maudem 嗨,朋友!如果您找到解决方案,请告诉我! :)
  • 你得到的错误是Android studio报的吗? Android Studio 可能不支持我自己不使用 Android Studio 的外部实体......也许有一种方法可以告诉 Android Studio 忽略“......被引用,但未声明”错误并无论如何构建。如果有人设法这样做,请报告,我会更新我的答案。
【解决方案4】:

是的,通过使用我在构建时创建的这个小型库,无需编写任何 Java/Kotlin 代码,仅 XML 即可:https://github.com/LikeTheSalad/android-string-reference

用法

根据您的示例,您必须像这样设置字符串:

<resources>
  <string name="db_table_name">tbl_name</string>
  <string name="template_ddl">create table ${db_table_name}</string>
</resources>

然后,在构建您的项目之后,您将获得:

<resources>
  <string name="ddl">create table tbl_name</string>
</resources>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2011-04-05
    • 2016-11-13
    • 1970-01-01
    • 2016-09-24
    相关资源
    最近更新 更多