我想在strings.xml文件中引用另一个字符串中的字符串,如下所示(特别注意“message_text”字符串内容的结尾):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="button_text">Add item</string>
<string name="message_text">You don't have any items yet! Add one by pressing the \'@string/button_text\' button.</string>
</resources>
我已经尝试了上面的语法,然后文本打印出“@ string / button_text”作为明文 . 不是我想要的 . 我想要打印消息文本“你还没有任何项目!按”添加项目“按钮添加一个项目 . ”
有没有任何已知的方法来实现我想要的?
RATIONALE:
我的应用程序有一个项目列表,但当该列表为空时,我会显示"@android:id/empty" TextView . TextView中的文本是通知用户如何添加新项目 . 我想让我的布局变得傻瓜变化(是的,我是个傻瓜:-)
10 回答
在不使用Java代码的情况下在xml中插入常用字符串(例如应用程序名称)的好方法:source
更新:
您甚至可以定义您的实体全球,例如:
RES /生/ entities.ent:
RES /值/ string.xml:
只要整个字符串包含引用名称,就可以引用另一个 . 例如,这将工作:
它对于设置默认值更有用:
现在,您可以在代码中的任何位置使用
string_default
,您可以随时轻松更改默认值 .我想你不能 . 但您可以根据需要“格式化”字符串:
在代码中:
在Android中,你无法在xml中连接字符串
Following is not supported
请查看下面的链接,了解如何实现它
How to concatenate multiple strings in android XML?
我创建了简单的gradle plugin,它允许你从另一个字符串中引用一个字符串 . 您可以引用在另一个文件中定义的字符串,例如在不同的构建变体或库中 . 这种方法的缺点 - IDE重构不会找到这样的引用 .
使用
{{string_name}}
语法来引用字符串:要集成插件,只需将下一个代码添加到应用程序或库模块级
build.gradle
文件中UPDATE: 该库不适用于Android gradle插件3.0及更高版本,因为新版本的插件使用aapt2将资源打包成.flat二进制格式,因此打包资源不可用于库 . 作为临时解决方案,您可以通过在gradle.properties文件中设置android.enableAapt2 = false来禁用aapt2 .
您可以使用自己的逻辑,以递归方式解析嵌套字符串 .
例如,从
Activity
调用它就像这样我已经为我的一个项目提出了一个肮脏的解决方案 . 它仅适用于TextViews,但也可以适用于其他小部件 . 请注意,它需要将链接括在方括号中(例如
[@string/foo]
) .这种方法的缺点是
setText()
将CharSequence
转换为String
,如果你传递像SpannableString
这样的东西就会出现问题 . 对于我的项目,这不是问题,因为我只使用它TextViews
,我不需要从我的Activity
访问 .使用新的data binding,您可以连接并在xml中执行更多操作 .
例如,如果你有message1和message2,你可以:
你甚至可以导入一些文本工具并调用String.format和朋友 .
不幸的是,如果你想在几个地方重复使用它可能会变得混乱,你不希望这些代码片到处都是 . 并且你不能在一个地方用xml定义它们(不是我所知道的)所以你可以创建一个封装这些组合的类:
然后你可以使用它(你需要导入带有数据绑定的类)
除了Francesco Laurita的上述答案之外https://stackoverflow.com/a/39870268/9400836
似乎有一个编译错误“&entity;被引用,但没有声明”,这可以通过引用像这样的外部声明来解决
RES /原料/ entities.ent
RES /值/ strings.xml中
虽然它编译并运行它有一个空值 . 也许有人知道如何解决这个问题 . 我会发表评论,但最低声望是50 .
您可以使用字符串占位符 (%s) 并在运行时使用java替换它们
在java中
然后将其设置为使用字符串的位置