Android中<xliff:g></xliff:g>的用法

在查阅修改Android源码的过程中经常能在字符串资源中看到类似下面的标签:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">

    <string name="xliff_string">
        今天是<xliff:g id="WEEK">%1$s</xliff:g>,<xliff:g id="DAY">%2$d</xliff:g></string>

</resources>

今天我们就从是什么、怎么用、为什么三个方面来学习一下。


是什么:

通过查看相关资料后得知xliff是一个缩写,全称XML Localization Interchange File Format ,即XML本地化数据交换格式。


怎么用:

用法其实也很简单,可简单分为三步:

  1. 修改xml文件中的resources标签,指定xliff格式的命名空间。
  2. 在字符串标签中引入
  3. 在java文件中通过Resources类的的getString(@StringRes int id, Object… formatArgs)方法给占位符提供值,并获取对应的字符串。

下面是一个例子:

一:首先在xml中定义字符串以及指定命名空间。

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">

    <string name="xliff_string">
        今天是<xliff:g id="WEEK">%1$s</xliff:g>,<xliff:g id="DAY">%2$d</xliff:g></string>

</resources>

二:在java代码中引用并提供参数。

String s = getResources().getString(R.string.xliff_string,"星期一",13);

最终s的内容是:今天是星期一,13号。

现在我们来对用法进行分析:

在id=”WEEK”的xliff标签中的格式是%1$s,其中1代表的是它的位置,s代表了传入的应该是个字符串,因此getString中传入的值“星期一”作为了第一个参数进行了替换,同理,id=”DAY”的xliff标签数字为2,最后一个字母为d,代表传入的应该是一个整形,因此13作为第二个参数进行了替换。


为什么:

为什么通过xliff标签能够做到这一点呢?其实稍微查看一下源码就可以理解:

    @NonNull
    public String getString(@StringRes int id, Object... formatArgs) throws NotFoundException {
        final String raw = getString(id);
        return String.format(mResourcesImpl.getConfiguration().getLocales().get(0), raw,
                formatArgs);
    }

可以看到getString方法其实是调用了String.format方法来进行解析。相信很多人在学习xliff的用法的时候也会觉得xliff的参数格式很熟悉,这就是因为在Java层用的就是我们熟悉的String.format去进行解析的。

因此xliff的参数格式肯定也不只有上面这么少这么简单,具体的参数可参考String.format方法。

本篇博客到此为止,欢迎拍砖指教。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过模拟NFC标签来模拟门禁卡。以下是一些步骤: 1. 在 Android Studio 创建一个新项目。 2. 在项目添加一个用于模拟NFC标签的Activity。 3. 在Activity添加以下代码来模拟NFC标签的UID和数据: ``` private static final byte[] UID = new byte[]{0x01, 0x02, 0x03, 0x04}; private static final byte[] DATA = "Hello, World!".getBytes(); ``` 4. 在Activity添加以下代码来模拟NFC标签的读取: ``` @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (Arrays.equals(tag.getId(), UID)) { String data = new String(tag.getNdef().getRecords()[0].getPayload()); Toast.makeText(this, data, Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "Unknown tag", Toast.LENGTH_LONG).show(); } } } ``` 5. 在AndroidManifest.xml文件添加以下代码来声明Activity和NFC权限: ``` <activity android:name=".NfcActivity"> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED"/> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter"/> </activity> <uses-permission android:name="android.permission.NFC"/> ``` 6. 在res/xml文件夹创建一个nfc_tech_filter.xml文件,并添加以下代码: ``` <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.Ndef</tech> </tech-list> </resources> ``` 这样,您就可以在模拟器或真实设备上模拟NFC标签,从而模拟门禁卡的功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值