这段时间做了一个侧边栏根据字母显示的ListView,不想每次都去写一个,所以就自己草草封装了一个不完全版本的KGLetterSideBar,因为之前做过的要么是英语,要么有自己的拼音库,这让我太不方便了,于是乎我想看看是不是有一种把汉字的拼音拿到的库之类的啥,搜了下,一般有两种做法:
- HanziToPinyin
- Pinyin4j
这两个有什么区别大家可以去搜索下,挺多的,不过好像很多人推荐HanziToPinyin,因为Pinyin4j貌似不支持多音字
我在这里用了HanziToPinyin,其实感觉用法挺简单的,但是我怎么都转换不成功,不知道是为什么,后面调试了一下,发现了这句关键代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public static HanziToPinyin getInstance() {
synchronized (HanziToPinyin.class) {
if (sInstance != null) {
return sInstance;
}
// Check if zh_CN collation data is available
final Locale locale[] = Collator.getAvailableLocales();
for (int i = 0; i < locale.length; i++) {
if (locale[i].equals(Locale.CHINA)) {
// Do self validation just once.
if (DEBUG) {
Log.d(TAG, "Self validation. Result: " + doSelfValidation());
}
sInstance = new HanziToPinyin(true);
return sInstance;
}
}
Log.w(TAG, "There is no Chinese collator, HanziToPinyin is disabled");
sInstance = new HanziToPinyin(false);
return sInstance;
}
}
其中的:
1 | if (locale[i].equals(Locale.CHINA)) |
始终为false,百思不得其解,后面在网上查了不少资料才知道,因为Collator本来就是去调的icu (International Components for Unicode)
我们可以通过Collator.getAvailableLocales()来查看有没有支持的语言
但是每个手机又不尽相同, 想说爱你不容易啊
先看看自带只能获取的locale
和中文相关的就一下这些:
- zh
- zh_HANS 简体中文
- zh_HANS_CN 大陆简体中文
- zh_HANS_SG 新加坡简体中文
- zh_HANT 繁体中文
- zh_HANT_HK 香港繁体中文
- zh_HANT_MO 澳门繁体中文
- zh_HANT_TW 台湾繁体中文
目前只有这几款(HANS 简体 HANT 繁体)
难怪不行,而且我看有人说各个手机可能会有差异,所以我在这里改了一下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26public static boolean isChinaCollator() {
Locale[] localeArray = Collator.getAvailableLocales();
if (localeArray.length > 0) {
List<Locale> locales = Arrays.asList(localeArray);
for (int i = 0; i < locales.size(); i++) {
if (Locale.CHINA.equals(locales.get(i))) {
return true;
}
}
}
if (isAdaptationLocale()) {
return true;
}
return false;
}
private static boolean isAdaptationLocale() {
boolean isAdaptation = false;
if (Locale.getDefault().equals(Locale.CHINA)) {
isAdaptation = true;
}
return isAdaptation;
}
因为我手机Nexus5获取Locale.getDefault()的值为zh_CN,而这个是上面locale[]列表里面没有的,所以相当于在isAdaptationLocale方法里面做了一个小小的适配,以后对其他手机的不同我也会及时更新