如果 locale=en 则获取英文字母,否则获取北欧字符
Get english letters if locale=en and nordic characters if it's not
如果我 select 英语,我一直试图只获取英文字符(26 个字符),如果我 select 任何北欧语言,我一直试图获取所有 29 个北欧字符。我正在努力寻找如何让它发挥作用。
public LetterAdapter(Context c) {
letters=new String[29];
for (int a = 0; a < 26; a++) {
letters[a] = "" + (char)(a+'A');
}
letters[26] = "\u00C6";
letters[27] = "\u00D8";
letters[28] = "\u00C5";
letterInf = LayoutInflater.from(c);
}
letters[26]、[27]、[28] 是添加到北欧字母表中的特殊字符,如果语言环境设置为 "en",我会尝试 show/hide或其他人。我试过使用这个:
public int getCount() {
if(!Locale.getDefault().getLanguage().equals("en){
return letters.length;
}else{
return letters.length-3;
}
}
这没有任何作用,我要么得到所有 29 个字符,要么只得到 26 个。
这是我的 getView
public View getView(int position, View convertView, ViewGroup parent) {
Button letterBtn;
if (convertView == null) {
letterBtn = (Button)letterInf.inflate(R.layout.letter, parent, false);
} else {
letterBtn = (Button) convertView;
}
letterBtn.setText(letters[position]);
return letterBtn;
}
我在这里错过了什么。
Java 无法获取国家字母。
英文字母表很容易,因为A-Z字母在ASCII字符集中是连续的,Unicode也使用这种字符集。在其他字符集中,例如EBCDIC,不是这样的
您必须提供您需要支持的各种字母表。
对于那些不知道我们在说什么的 SO 用户,有些语言在字母表中有额外的字母。比较:
English: a bcdefghijklmno pqrs tu vwxyz
Danish: a bcdefghijklmno pqrs tu vwxyzæøå
Norwegian: a bcdefghijklmno pqrs tu vwxyzæøå
Swedish: a bcdefghijklmno pqrs tu vwxyzåäö
German: aäbcdefghijklmnoöpqrsßtuüvwxyz
这会影响字典排序顺序,其中德语可能会像显示的那样排序,但也可以是 different。
在 Java 中,Collator 可用于为不同语言(语言环境)适当地对字符串进行排序,但不能用于检索字母表。
更新
LetterAdapter
中的代码应该创建具有适当长度的数组,并且应该能够支持像上面显示的德语这样的字母表。此外,getLanguage() 的 javadoc 声明 getLanguage().equals("xx")
是错误的。
所以,可能的实现,用字母字符串替换字母数组:
private final String letters;
public LetterAdapter(Context c) {
String lang = Locale.getDefault().getLanguage();
if (lang.equals(new Locale("da").getLanguage())
this.letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00C6\u00D8\u00C5"; // Danish
else if (lang.equals(new Locale("no").getLanguage())
this.letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00C6\u00D8\u00C5"; // Norwegian
else if (lang.equals(new Locale("sv").getLanguage())
this.letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00C5\u00C4\u00D6"; // Swedish
else if (lang.equals(new Locale("de").getLanguage())
this.letters = "A\u00C4BCDEFGHIJKLMNO\u00D6PQRS\u00DFTU\u00DCVWXYZ"; // German
else
this.letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // English (and others)
letterInf = LayoutInflater.from(c);
}
public int getCount() {
return this.letters.length();
}
public View getView(int position, View convertView, ViewGroup parent) {
Button letterBtn;
if (convertView == null) {
letterBtn = (Button)letterInf.inflate(R.layout.letter, parent, false);
} else {
letterBtn = (Button) convertView;
}
letterBtn.setText(String.valueOf(this.letters.charAt(position)));
return letterBtn;
}
如果我 select 英语,我一直试图只获取英文字符(26 个字符),如果我 select 任何北欧语言,我一直试图获取所有 29 个北欧字符。我正在努力寻找如何让它发挥作用。
public LetterAdapter(Context c) {
letters=new String[29];
for (int a = 0; a < 26; a++) {
letters[a] = "" + (char)(a+'A');
}
letters[26] = "\u00C6";
letters[27] = "\u00D8";
letters[28] = "\u00C5";
letterInf = LayoutInflater.from(c);
}
letters[26]、[27]、[28] 是添加到北欧字母表中的特殊字符,如果语言环境设置为 "en",我会尝试 show/hide或其他人。我试过使用这个:
public int getCount() {
if(!Locale.getDefault().getLanguage().equals("en){
return letters.length;
}else{
return letters.length-3;
}
}
这没有任何作用,我要么得到所有 29 个字符,要么只得到 26 个。
这是我的 getView
public View getView(int position, View convertView, ViewGroup parent) {
Button letterBtn;
if (convertView == null) {
letterBtn = (Button)letterInf.inflate(R.layout.letter, parent, false);
} else {
letterBtn = (Button) convertView;
}
letterBtn.setText(letters[position]);
return letterBtn;
}
我在这里错过了什么。
Java 无法获取国家字母。
英文字母表很容易,因为A-Z字母在ASCII字符集中是连续的,Unicode也使用这种字符集。在其他字符集中,例如EBCDIC,不是这样的
您必须提供您需要支持的各种字母表。
对于那些不知道我们在说什么的 SO 用户,有些语言在字母表中有额外的字母。比较:
English: a bcdefghijklmno pqrs tu vwxyz
Danish: a bcdefghijklmno pqrs tu vwxyzæøå
Norwegian: a bcdefghijklmno pqrs tu vwxyzæøå
Swedish: a bcdefghijklmno pqrs tu vwxyzåäö
German: aäbcdefghijklmnoöpqrsßtuüvwxyz
这会影响字典排序顺序,其中德语可能会像显示的那样排序,但也可以是 different。
在 Java 中,Collator 可用于为不同语言(语言环境)适当地对字符串进行排序,但不能用于检索字母表。
更新
LetterAdapter
中的代码应该创建具有适当长度的数组,并且应该能够支持像上面显示的德语这样的字母表。此外,getLanguage() 的 javadoc 声明 getLanguage().equals("xx")
是错误的。
所以,可能的实现,用字母字符串替换字母数组:
private final String letters;
public LetterAdapter(Context c) {
String lang = Locale.getDefault().getLanguage();
if (lang.equals(new Locale("da").getLanguage())
this.letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00C6\u00D8\u00C5"; // Danish
else if (lang.equals(new Locale("no").getLanguage())
this.letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00C6\u00D8\u00C5"; // Norwegian
else if (lang.equals(new Locale("sv").getLanguage())
this.letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00C5\u00C4\u00D6"; // Swedish
else if (lang.equals(new Locale("de").getLanguage())
this.letters = "A\u00C4BCDEFGHIJKLMNO\u00D6PQRS\u00DFTU\u00DCVWXYZ"; // German
else
this.letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // English (and others)
letterInf = LayoutInflater.from(c);
}
public int getCount() {
return this.letters.length();
}
public View getView(int position, View convertView, ViewGroup parent) {
Button letterBtn;
if (convertView == null) {
letterBtn = (Button)letterInf.inflate(R.layout.letter, parent, false);
} else {
letterBtn = (Button) convertView;
}
letterBtn.setText(String.valueOf(this.letters.charAt(position)));
return letterBtn;
}