在最近的一个开发中,有一个这样的小小需求,就是某一个标签存在三种状态:
a、正在连接XXX设备
b、已连接XXX设备
c、与XXX设备已断开
从上面我们可以看出,不变的是XXX,我们在实际开发中很有可能遇到这样的情况。当然其解决办法也是有很多种,但是今天我想说的是可以利用XLIFF实现这种效果。
XLIFF全称为XML Localization Interchange File Format。维基百科给出的解释是:XLIFF(XML本地化交换文件格式)是创建标准化本地化的数据,在本地化过程和CAT工具文件的通用格式工具之间传递方式一种基于XML的格式。 XLIFF是由OASIS于2002年其目前的规范标准化是2.0,2014年8月5日公布。
该规范的目的是在本地化行业。它指定的元素和属性来存储从各种原始文件格式及其相应的翻译提取的内容。我们的目标是从抽象与具体的格式,如HTML工程技术本地化的能力。XLIFF形成了XML创作和本地化(OAXAL)参考架构的开放式架构的一部分。
这么好的东西,我们大Android欧巴肯定也要支持啊,的确在Android官方也有关于XLIFF的介绍,地址为:http://developer.android.com/distribute/tools/localization-checklist.html,(自备梯子)。
小伙伴们是不是迫不及待想知道如何在android中使用呢?现在跟随我的步伐一步步来实现吧!
首先我们打开我们的string.xml添加如下字符串:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">XLIFF</string>
<string name="bt_connectioning">正在连接<xliff:g id="device_name">%1$s</xliff:g>设备</string>
<string name="bt_connectioned">已连接<xliff:g id="device_name">%1$s</xliff:g>设备</string>
<string name="bt_connection_failed">与<xliff:g id="device_name">%1$s</xliff:g>设备已断开</string>
</resources>
注意两点:
a、我们在中新增了一个命名空间:xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"
b、我们在标签中又嵌套了一个子标签:<xliff:g id="device_name">%1$s</xliff:g>
<xliff:g id="device_name">%1$s</xliff:g>
device_name:这个名字名字你可以随便写,阿猫阿狗你喜欢就好
%1:表示替换第一个
s:表示字符串
例如:
在java代码中使用:<xliff id="a_mao_or_a_gou">%1$s</xliff:g>
getString(R.string.yourstring,”不变的字符串”);
其他用法:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Example placeholder for a special unicode symbol -->
<string name="star_rating">Check out our 5
<xliff:g id="star">\u2605</xliff:g>
</string>
<!-- Example placeholder for a for a URL -->
<string name="app_homeurl">
Visit us at <xliff:g id="application_homepage">http://my/app/home.html</xliff:g>
</string>
<!-- Example placeholder for a name -->
<string name="prod_name">
Learn more at <xliff:g id="prod_gamegroup">Game Group</xliff:g>
</string>
<!-- Example placeholder for a literal -->
<string name="promo_message">
Please use the "<xliff:g id="promotion_code">ABCDEFG</xliff:g>” to get a discount.
</string>
...
</resources>
给一个例子代码,当然你可以根据服务返回不同的状态自己去改变,只是我给的例子是三个按钮而已:
public class MainActivity extends AppCompatActivity implements View.OnClickListener
{
private Button mBtnChange1;
private Button mBtnChange2;
private Button mBtnChange3;
private TextView mTvState;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView()
{
mBtnChange1 = (Button) findViewById(R.id.btn_change1);
mBtnChange1.setOnClickListener(this);
mBtnChange2 = (Button) findViewById(R.id.btn_change2);
mBtnChange2.setOnClickListener(this);
mBtnChange3 = (Button) findViewById(R.id.btn_change3);
mBtnChange3.setOnClickListener(this);
mTvState = (TextView) findViewById(R.id.tv_state);
}
@Override
public void onClick(View v)
{
Message msg = Message.obtain();
switch (v.getId())
{
case R.id.btn_change1:
msg.what = 1;
myHandler.sendMessage(msg);
break;
case R.id.btn_change2:
msg.what = 2;
myHandler.sendMessage(msg);
break;
case R.id.btn_change3:
msg.what = 3;
myHandler.sendMessage(msg);
break;
default:
break;
}
}
Handler myHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
case 1:
setState(getString(R.string.bt_connectioning, "XXX"));
break;
case 2:
setState(getString(R.string.bt_connectioned, "XXX"));
break;
case 3:
setState(getString(R.string.bt_connection_failed, "XXX"));
break;
}
}
};
private void setState(String state)
{
mTvState.setText(state);
}
}