我想从我的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”作为明文。不是我想要的。我希望消息文本打印“您还没有任何项目!”按‘添加项目’按钮添加一个。”

有什么已知的方法可以达到我想要的吗?

理由是: 我的应用程序有一个项目列表,但当该列表为空时,我显示一个“@android:id/空”TextView代替。TextView中的文本通知用户如何添加新项。我想让我的布局万无一失的变化(是的,我是傻瓜的问题:-)


当前回答

只要整个字符串由引用名称组成,就可以在另一个字符串中引用一个。例如,这将工作:

<string name="app_name">My App</string>
<string name="activity_title">@string/app_name</string>
<string name="message_title">@string/app_name</string>

它甚至在设置默认值时更有用:

<string name="string1">String 1</string>
<string name="string2">String 2</string>
<string name="string3">String 3</string>
<string name="string_default">@string/string1</string>

现在,您可以在代码中的任何地方使用string_default,并且可以随时轻松更改默认值。

其他回答

我创建了一个简单的gradle插件,允许你从另一个字符串引用一个字符串。您可以引用在另一个文件中定义的字符串,例如在不同的构建变体或库中。这种方法的缺点——IDE重构不会找到这样的引用。

使用{{string_name}}语法引用字符串:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="super">Super</string>
    <string name="app_name">My {{super}} App</string>
    <string name="app_description">Name of my application is: {{app_name}}</string>
</resources>

要集成插件,只需将下一个代码添加到应用程序或库模块级构建中。gradle文件

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "gradle.plugin.android-text-resolver:buildSrc:1.2.0"
  }
}

apply plugin: "com.icesmith.androidtextresolver"

更新: 该库不支持Android gradle插件3.0及以上版本,因为该插件的新版本使用aapt2,它将资源打包为.flat二进制格式,因此打包的资源对该库不可用。作为临时解决方案,您可以通过设置android禁用aapt2。在gradle中enableAapt2=false。属性文件。

使用新的数据绑定,您可以在xml中进行连接和更多操作。

例如,如果你有message1和message2,你可以:

android:text="@{@string/message1 + ': ' + @string/message2}"

你甚至可以导入一些文本utils并调用String。格式和朋友。

不幸的是,如果您想在多个地方重用它,它可能会变得混乱,您不希望这些代码片段到处都是。你不能在一个地方用xml定义它们(我不知道) 因此,你可以创建一个类来封装这些组合:

public final class StringCompositions {
    public static final String completeMessage = getString(R.string.message1) + ": " + getString(R.string.message2);
}

然后您可以使用它(您将需要导入带有数据绑定的类)

android:text="@{StringCompositions.completeMessage}"

您可以使用字符串占位符(%s),并在运行时使用java替换它们

<resources>
<string name="button_text">Add item</string>
<string name="message_text">Custom text %s </string>
</resources>

在Java中

String final = String.format(getString(R.string.message_text),getString(R.string.button_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 %1$s button.</string>
</resources>

在代码中:

Resources res = getResources();
String text = String.format(res.getString(R.string.message_text),
                            res.getString(R.string.button_text));

只要整个字符串由引用名称组成,就可以在另一个字符串中引用一个。例如,这将工作:

<string name="app_name">My App</string>
<string name="activity_title">@string/app_name</string>
<string name="message_title">@string/app_name</string>

它甚至在设置默认值时更有用:

<string name="string1">String 1</string>
<string name="string2">String 2</string>
<string name="string3">String 3</string>
<string name="string_default">@string/string1</string>

现在,您可以在代码中的任何地方使用string_default,并且可以随时轻松更改默认值。