在Android资源XML文件中直接进行字符串替换是否可行?

9
在我的安卓应用中,我有一个大的字符串资源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中是否可行?


2
你可能不需要将数据库命名和查询创建内容放在XML资源中,因为它们不会依赖于本地化或设备限定符。我建议将这些内容放在全局项目配置文件中,也许使用一个静态类来创建查询 - 这只是我的想法!我不知道在res文件中是否可以实现上述内容 :) - Dori
4个回答

12
在你想要动态修改的第二个资源字符串中添加%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工具是否会这样做。使用建议的答案仍然需要我自己完成所有工作。 - vladimir.vivien

5
"的确可以实现。"
<?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>

1
嗨,我尝试了这个,得到了“未解决的实体引用”的错误。我的路径是“/raw/entities/ent”,因为当我将路径设置为与示例中编写的相同时,所有内容都会标记为红色并出现“找不到res”的错误。 - Elior
2
我得到了以下错误信息:错误:引用了实体“appname”,但未声明。 我按照示例完全操作,但无法使其正常工作... - maudem
这个解决方案对我实际上并不起作用:请参见我的问题:https://dev59.com/bVUL5IYBdhLWcg3wDUW2 - Seraphim's
@maudem 你好朋友!如果你找到了解决方案,请告诉我! :) - Seraphim's
1
你收到的错误是由Android Studio报告的吗?可能是因为Android Studio不支持外部实体。我自己不使用Android Studio...也许有一种方法可以告诉Android Studio忽略"...被引用但未声明"的错误并继续构建。如果有人成功了,请报告一下,我会更新我的答案。 - Joseph Garrone
显示剩余2条评论

1

是的,使用我创建的这个小型库,只需使用XML,而无需编写任何Java/Kotlin代码即可实现构建时操作:https://github.com/LikeTheSalad/android-stem

用法

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

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

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

<!-- Auto generated during compilation -->
<resources>
  <string name="ddl">create table tbl_name</string>
</resources>

0

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


1
我并不想在运行时更改字符串,而是希望 Android 的代码生成器在设计时为我创建 R.java 类时进行替换。显然这是不可能的。 - vladimir.vivien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接