我想从我的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,并且可以随时轻松更改默认值。
在xml中插入一个经常使用的字符串(例如应用程序名称)而不使用Java代码的好方法:
源
<?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 /生/ entities.ent:
<!ENTITY appname "MyAppName">
<!ENTITY author "MrGreen">
res /价值/ 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>
我已经创建了一个小库,允许您在构建时解析这些占位符,因此您不必添加任何Java/Kotlin代码来实现您想要的结果。
基于你的例子,你必须像这样设置你的字符串:
<?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 ${button_text} button.</string>
</resources>
然后插件将负责生成以下内容:
<!-- Auto generated during compilation -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="message_text">You don't have any items yet! Add one by pressing the Add item button.</string>
</resources>
它也适用于本地化和风味字符串,生成的字符串将保持自己更新,每当你改变你的模板或它的值。
更多信息请访问:https://github.com/LikeTheSalad/android-stem
我知道这是一个老帖子,但我想分享我为我的一个项目想出的快速而肮脏的解决方案。它只适用于textview,但可以
也可以适应其他小部件。注意,它要求链接用方括号括起来(例如[@string/foo])。
public class RefResolvingTextView extends TextView
{
// ...
@Override
public void setText(CharSequence text, BufferType type)
{
final StringBuilder sb = new StringBuilder(text);
final String defPackage = getContext().getApplicationContext().
getPackageName();
int beg;
while((beg = sb.indexOf("[@string/")) != -1)
{
int end = sb.indexOf("]", beg);
String name = sb.substring(beg + 2, end);
int resId = getResources().getIdentifier(name, null, defPackage);
if(resId == 0)
{
throw new IllegalArgumentException(
"Failed to resolve link to @" + name);
}
sb.replace(beg, end + 1, getContext().getString(resId));
}
super.setText(sb, type);
}
}
这种方法的缺点是setText()将CharSequence转换为
String,这是一个问题,如果你传递像SpannableString;为我的
项目这不是一个问题,因为我只使用它的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,并且可以随时轻松更改默认值。