You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android(Java)国际化:布局XML中xliff:g默认值失效问题求助

Android中xliff:g标签example属性在XML布局中不生效的问题

问题描述

在Android Studio做i18n国际化开发时,使用<xliff:g>标签实现字符串变量注入,Java代码中通过getString()调用时显示正常,但XML布局直接引用对应字符串时,只会显示占位符%1$s,<xliff:g>的example属性完全不起作用。

示例代码

strings.xml

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <string name="starting">Start: <xliff:g id="unknown_position" example="Unknown position">%1$s</xliff:g>.</string>
    <string name="end">Arrival: <xliff:g id="unknown_position" example="Unknown position">%1$s</xliff:g>.</string>
    <string name="beginning_default">• Beginning: <xliff:g id="unknown_start_date" example="21 august 2022 at 14h21">%1$s</xliff:g></string>
    <string name="ending_default">• End: <xliff:g id="unknown_end_date" example="22 august 2022 at 14h20">%1$s</xliff:g></string>
</resources>

布局文件(activity_layout.xml)

<TextView
    android:id="@+id/startPositionText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:text="@string/starting"
    android:textColor="@color/white"
    android:textSize="20sp" />

<TextView
    android:id="@+id/endPositionText"
    android:layout_below="@id/startPositionText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:text="@string/end"
    android:textColor="@color/white"
    android:textSize="20sp" />

<TextView
    android:id="@+id/startText"
    android:layout_below="@+id/endPositionText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/beginning_default"
    android:textColor="@color/white"
    android:textSize="17sp" />

<TextView
    android:id="@+id/endText"
    android:layout_below="@id/startText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/ending_default"
    android:textColor="@color/white"
    android:textSize="17sp" />

原因分析

  1. <xliff:g>的example属性仅作为翻译参考,用于告诉翻译人员该占位符对应的内容格式或示例,并非占位符的默认替换值,没有自动填充占位符的功能。
  2. Java代码中getString()能正常显示是因为你主动传入了替换参数(比如传入了example中的字符串),而XML布局直接引用字符串时,没有传递任何替换参数,系统只能原样输出占位符。

解决方法

方法一:在代码中传入替换参数

在Activity/Fragment中通过代码给TextView设置文本时,传入占位符对应的参数:

// 位置相关文本
startPositionText.setText(getString(R.string.starting, "Unknown position"));
endPositionText.setText(getString(R.string.end, "Unknown position"));

// 日期相关文本
startText.setText(getString(R.string.beginning_default, "21 august 2022 at 14h21"));
endText.setText(getString(R.string.ending_default, "22 august 2022 at 14h20"));

方法二:使用DataBinding直接在布局中传参

如果项目使用DataBinding,可以直接在布局中传递参数,无需在代码中处理:

<TextView
    android:id="@+id/startPositionText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:text="@{@string/starting(`Unknown position`)}"
    android:textColor="@color/white"
    android:textSize="20sp" />

方法三:定义固定字符串(无需动态替换时)

如果占位符内容不需要动态修改,可以直接把默认值写入字符串资源,去掉占位符:

<string name="starting">Start: Unknown position.</string>

内容的提问来源于stack exchange,提问作者Pioupia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:15:29