在ICS首选项中转义%-我真的必须编写特定版本的字符串处理吗



我有一个应用程序在ICS上崩溃。到那时为止工作得很好(尽管我不确定我是否真的有蜂窝平台可以测试,我们所有的测试手机要么是姜饼,要么更低,现在我有几个ICS手机可以玩)。

我的首选项页面中的以下代码(从onResume和OnPreferenceChangeListener调用)运行良好:

protected void setBatteryAlarmSummary(String newValue){
    Preference batteryAlarm = (Preference) findPreference( getString(R.string.battery_low_alarm) );
    StringBuilder summary = new StringBuilder();
    summary.append(getString(R.string.battery_alarm_summary_label));
    summary.append(" ");
    summary.append(newValue);
    summary.append("%");
    batteryAlarm.setSummary(summary);
}

这将预处理汇总设置为"10%时电池电量低报警"。现在,ICS崩溃了。不是当它执行setSummary时,也不是当页面显示时,而是当你稍微滚动一下首选项时,显然会触发渲染(这个项目向下大约8个项目,所以它在列表中"在折叠下面")。修复ICS很容易,只需跳过百分比符号:

summary.append("%%");

然而,姜饼上的代码显示"10%时电池电量不足警报"

我可以根据版本来修改它,但这太傻了。他们真的打破了偏好渲染的向后兼容性吗,还是这只是三星的事情(不幸的是,这是我目前唯一的ICS测试平台)?

您可以尝试使用Unicode等效的百分号,如:

summary.append("u0025");

这应该行得通。

通常,您在strings.xml:中处理此问题

<string name="battery_low_alarm_summary" formatted="false">Low Battery Alarm at 10%</string>

formatted="false"将使其适用于所有版本的Android。

但是一旦您本地化了这个字符串,您确实需要一个占位符。我想你必须写:

<string name="battery_low_alarm_summary">Low Battery Alarm at %d%%</string>

我还没有测试过这一点,但我强烈希望使用任何现代版本的SDK构建都能在这里做正确的事情,即使结果是在旧版本的Android上运行的。

最新更新