我正在使用格式化的货币字符串获取一些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">₽</string>
<string name="rubleSymbolHTMLHex">₽</string>
同样的问题,在旧手机上显示为正方形但适用于Android 5.0,但没有任何旧版本。
已解决请参阅我的回答
答案 0 :(得分:12)
我修好了。我刚刚使用了2015年1月更新的新版Google Roboto字体,并使用了卢布符号。
https://www.google.com/fonts/specimen/Roboto#pairings
研究显示,2014年俄罗斯改变了他们的货币符号,因此旧字体没有新的字形,所以对于有类似问题的其他人,看看你的字体是否已经更新
答案 1 :(得分:6)
问题手机的默认字体可能缺少俄罗斯卢布标志符号。尝试将其硬编码到应用程序中的某个TextView中,以确保这确实是问题,而不是其他一些JSON解析错误左右(似乎不太可能在某些手机上运行)。
如果缺少字形是您的问题,在项目中包含您自己的字体相当简单。这样你可以确定你可以支持你需要的所有字形。
以下是以编程方式执行此操作的步骤:
TypeFace
将其加载为TypeFace myFont = Typeface.createFromAsset(activity.getAssets(), "fonts/font.ttf")
对象(根据需要替换myFont
和font.ttf
)TextViews
将其分配给您的所有Paints
,myTextView.setTypeface(myFont)
等。似乎还有一些技巧允许您将其设置为default font for your entire app。我没有太多使用图形设计师,但我确信它也不会那么困难。此外,这些说明适用于Android Eclipse插件。虽然Android Studio中的代码可能相同,但我不确定文件夹结构是否相同。文档说明了将资产置于main/assets而不仅仅是资产,例如......
需要考虑的几件事情:
额外的好处:您可以将一些自己的custom glyphs添加到字体中,只需将相应的“字母”放入TextView中即可轻松将简单的单色矢量图形包含到您的应用中(请记住{{3 }}?)。
答案 2 :(得分:2)
我在答案https://stackoverflow.com/a/36338231/1078641中找到了解决方案,将&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'>
将&subset=all
参数添加到链接后,我可以在Android设备上成功查看卢布符号
<link href='https://fonts.googleapis.com/css?family=Roboto:400,300italic,300,400italic,500,500italic,700,700italic&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>