Java Android:对一个EditText使用两种自定义字体
这听起来可能有点可疑,但即使是我也不知道这在android中是否可行。要求是我需要在edittext中写两种语言,一种是乌尔都语,另一种是默认英语,现在问题在于字体,因为我必须使用乌尔都语字体作为默认字体,我使用setTypeface,如下所示:Java Android:对一个EditText使用两种自定义字体,java,android,mobile,fonts,typeface,Java,Android,Mobile,Fonts,Typeface,这听起来可能有点可疑,但即使是我也不知道这在android中是否可行。要求是我需要在edittext中写两种语言,一种是乌尔都语,另一种是默认英语,现在问题在于字体,因为我必须使用乌尔都语字体作为默认字体,我使用setTypeface,如下所示: editText.setTypeface(englishFont); if(Arrays.asList(urduCodes).contains(Integer.toHexString(text.charAt(i)).toUpperCase()))
editText.setTypeface(englishFont);
if(Arrays.asList(urduCodes).contains(Integer.toHexString(text.charAt(i)).toUpperCase()))
{
System.out.println("different: "+text.charAt(i));
SpannableStringBuilder urduBLD;
urduBLD = new SpannableStringBuilder("");
urduBLD.append(edi.getText().charAt(i));
System.out.println("urduBLD: "+urduBLD);
urduBLD.setSpan(new StyleSpan(urduFont.getStyle()),urduBLD.length(),urduBLD.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
stringBuilder.append(urduBLD);
} else
{
System.out.println(text.charAt(i)+"-Code:"+(int)text.charAt(i)+"-"+Integer.toHexString(text.charAt(i)));
SpannableStringBuilder engBLD;
engBLD = new SpannableStringBuilder("");
engBLD.append(edi.getText().charAt(i));
System.out.println("engBLD: "+engBLD);
engBLD.setSpan(new StyleSpan(englishFont.getStyle()),engBLD.length(),engBLD.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
stringBuilder.append(engBLD);
}
但问题是这种字体的英文不好,事实上它比平时小,因此我不得不使用另一种英文字体,但这造成了问题,我从editText中获取getText,检测乌尔都语和英语字符,然后使用spannableStringBuilder相应地更改字体,如下所示:
editText.setTypeface(englishFont);
if(Arrays.asList(urduCodes).contains(Integer.toHexString(text.charAt(i)).toUpperCase()))
{
System.out.println("different: "+text.charAt(i));
SpannableStringBuilder urduBLD;
urduBLD = new SpannableStringBuilder("");
urduBLD.append(edi.getText().charAt(i));
System.out.println("urduBLD: "+urduBLD);
urduBLD.setSpan(new StyleSpan(urduFont.getStyle()),urduBLD.length(),urduBLD.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
stringBuilder.append(urduBLD);
} else
{
System.out.println(text.charAt(i)+"-Code:"+(int)text.charAt(i)+"-"+Integer.toHexString(text.charAt(i)));
SpannableStringBuilder engBLD;
engBLD = new SpannableStringBuilder("");
engBLD.append(edi.getText().charAt(i));
System.out.println("engBLD: "+engBLD);
engBLD.setSpan(new StyleSpan(englishFont.getStyle()),engBLD.length(),engBLD.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
stringBuilder.append(engBLD);
}
但这并不能解决问题,editText中的文本保持不变,字体不变。这是可能的还是不可能的???经过一些研究和努力,我终于能够为此创建一个通用函数:
public SpannableStringBuilder setWord(String text)
{
tokenList = new ArrayList<String>();
startIndext = 0;
endIndex = 0;
isEnglish = false;
stringBuilder = new SpannableStringBuilder("");
Log.i("CustomUrduKeyBoard","inside setWord text is: "+text+" stringBuilder: "+stringBuilder);
if(text == null)
{
} else
{
for (int i = 0; i < text.length(); i++)
{
// System.out.println(text.charAt(i) + "-Code:" + (int) text.charAt(i)
// + "-" + Integer.toHexString(text.charAt(i)));
if (text.charAt(i) < 255)
{
if (!isEnglish)
{
endIndex = i;
String token = text.substring(startIndext, endIndex);
SpannableStringBuilder urduBLD;
urduBLD = new SpannableStringBuilder("");
urduBLD.append(token);
urduBLD.setSpan(new CustomTypefaceSpan("", urduFont),0,urduBLD.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
stringBuilder.append(urduBLD);
tokenList.add(urduBLD.toString());
startIndext = endIndex;
}
isEnglish = true;
// english
continue;
} else
{
if (isEnglish)
{
endIndex = i;
String token = text.substring(startIndext, endIndex);
SpannableStringBuilder engBLD;
engBLD = new SpannableStringBuilder("");
engBLD.append(token);
engBLD.setSpan(new CustomTypefaceSpan("", englishFont),0,engBLD.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
stringBuilder.append(engBLD);
tokenList.add(engBLD.toString());
startIndext = endIndex;
}
isEnglish = false;
// urdu
continue;
}
}
String token = text.substring(startIndext, text.length());
for (int i = 0; i < token.length(); i++)
{
if (token.charAt(i) < 255)
{
SpannableStringBuilder urduBLD;
urduBLD = new SpannableStringBuilder("");
urduBLD.append(token);
urduBLD.setSpan(new CustomTypefaceSpan("", englishFont),0,urduBLD.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
stringBuilder.append(urduBLD);
tokenList.add(urduBLD.toString());
break;
} else
{
SpannableStringBuilder engBLD;
engBLD = new SpannableStringBuilder("");
engBLD.append(token);
engBLD.setSpan(new CustomTypefaceSpan("", urduFont),0,engBLD.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
stringBuilder.append(engBLD);
tokenList.add(engBLD.toString());
break;
}
}
}
return stringBuilder;
}
public SpannableStringBuilder setWord(字符串文本)
{
tokenList=newarraylist();
StartIndex=0;
endIndex=0;
isEnglish=假;
stringBuilder=新的SpannableStringBuilder(“”);
Log.i(“CustomUrduKeyBoard”,“内部设置字文本为:“+text+”stringBuilder:“+stringBuilder”);
if(text==null)
{
}否则
{
对于(int i=0;i
为什么不使用两个eidtText?一个用于urdhu,另一个用于English@blogger?这可能会有所帮助:因为在活动中只需要一个EditText,两种语言应该使用相同的语言EditText@Opiatefuchs这对于TextView而不是EditText是正确的,我已经测试过了。。。