Android:某些手机上没有显示俄罗斯卢布货币?

时间:2015-05-14 14:32:12

标签: android

我正在使用格式化的货币字符串获取一些JSON数据,如此

₽35

然而,我注意到在Nexus 5(Lollipop)上它显示正确,但其他手机如HTC one mini和Samsung GT-I9505,它显示一个空白字符。

我试图研究这个问题,除了在XML布局文件中找不到解决方案之外,我确实找不到这条线

<?xml version="1.0" encoding="utf-8"?>

但我仍有同样的问题

请帮忙

编辑2015年5月15日

加载自定义字体NotoSans(请注意我知道这会泄漏内存,但它只是一个快速测试)

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView ruble = (TextView)findViewById(R.id.ruble);
        Typeface myFont = Typeface.createFromAsset(getAssets(),"fonts/NotoSans-Regular.ttf");
        ruble.setTypeface(myFont);
    }

在strings.xml中定义的俄罗斯卢布符号(注意我尝试了所有)

     <string name="rubleSymbolJava">\u20BD</string>
  <string name="rubleSymbolHTML">&#8381;</string>
    <string name="rubleSymbolHTMLHex">&#x20bd;</string>

同样的问题,在旧手机上显示为正方形但适用于Android 5.0,但没有任何旧版本。

已解决请参阅我的回答

5 个答案:

答案 0 :(得分:12)

我修好了。我刚刚使用了2015年1月更新的新版Google Roboto字体,并使用了卢布符号。

https://www.google.com/fonts/specimen/Roboto#pairings

研究显示,2014年俄罗斯改变了他们的货币符号,因此旧字体没有新的字形,所以对于有类似问题的其他人,看看你的字体是否已经更新

答案 1 :(得分:6)

问题手机的默认字体可能缺少俄罗斯卢布标志符号。尝试将其硬编码到应用程序中的某个TextView中,以确保这确实是问题,而不是其他一些JSON解析错误左右(似乎不太可能在某些手机上运行)。

如果缺少字形是您的问题,在项目中包含您自己的字体相当简单。这样你可以确定你可以支持你需要的所有字形。

以下是以编程方式执行此操作的步骤:

我没有太多使用图形设计师,但我确信它也不会那么困难。此外,这些说明适用于Android Eclipse插件。虽然Android Studio中的代码可能相同,但我不确定文件夹结构是否相同。文档说明了将资产置于main/assets而不仅仅是资产,例如......

需要考虑的几件事情:

  • 确保您选择的字体分发不违反该字体的任何许可。
  • 您的应用现在将不再使用设备的默认字体,这意味着您的应用在各种设备上看起来会更加相似和可预测,但它可能会在可能使用非常不同的默认字体的特定设备上的其他应用中脱颖而出。 / LI>
  • .ttf 文件的大小将增加到您应用的大小。大多数字体相当小(约100KB),但有些字体变大(几MB),特别是如果它们支持许多不同的语言,这可能会成为一个问题。
  • 确保您的字体支持项目所需的所有语言中的所有字形。

额外的好处:您可以将一些自己的custom glyphs添加到字体中,只需将相应的“字母”放入TextView中即可轻松将简单的单色矢量图形包含到您的应用中(请记住{{3 }}?)。

答案 2 :(得分:2)

我在答案https://stackoverflow.com/a/36338231/1078641中找到了解决方案,将&amp;subset=all参数添加到Roboto字体链接。

Roboto字体的原始链接就像那样

<link href='https://fonts.googleapis.com/css?family=Roboto:400,300italic,300,400italic,500,500italic,700,700italic' rel='stylesheet' type='text/css'>

&amp;subset=all参数添加到链接后,我可以在Android设备上成功查看卢布符号

<link href='https://fonts.googleapis.com/css?family=Roboto:400,300italic,300,400italic,500,500italic,700,700italic&amp;subset=all' rel='stylesheet' type='text/css'>

答案 3 :(得分:0)

您可以使用以下代码检查字形是否存在 https://stackoverflow.com/a/29938454/755804

如果它不存在,您需要提供图像并使用TextViewWithImages或将其替换为字符序列。

答案 4 :(得分:0)

您还可以检查Android版本。我认为,某些使用API​​ 19的手机支持俄罗斯卢布,但是在API 21上它们都支持俄罗斯卢布。添加字符串资源而不是通过编程检查和替换会更容易。

阅读Trying to use <!ENTITY in ANDROID resources with error: "The entity was referenced, but not declared."后,我在strings.xml中创建了一个新文件res/values-v21

因此,在values/strings.xml中:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY rouble "р.">
    ]>
<resources>
    <string name="saaki">Галстук Сааки - %1$s &rouble;</string>
</resources>

values-v21/strings.xml中:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
    <!ENTITY rouble "₽">
    ]>
<resources>
    <string name="saaki">Галстук Сааки - %1$s &rouble;</string>
</resources>