在单个屏幕上以多种语言显示的Android字体 [英] Android Font in more than one language on single screen

查看:83
本文介绍了在单个屏幕上以多种语言显示的Android字体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Android新手.我正在实现一个应用程序,它将使用两种语言:英语和乌尔都语.基本上会有一些阿拉伯语文本,根据用户选择的语言,其含义将为英语或乌尔都语.

I am new to Android. And I am implementing an application which will be in two languages English and Urdu. Basically there will be some text in arabic and its meaning will be in english or urdu based on the user selected language.

我想更改阿拉伯文字的字体,如果我在整个应用程序中应用字体,它也会改变乌尔都语和英语的外观.因此,使用TypeFace将字体应用于包含阿拉伯字体的每个textview会很好吗,还是有一些更好的方法来实现呢?

I want to change the font of arabic text, If I apply font in whole application it will change the look of Urdu and English also. So is this will be fine to just apply font to each textview that contains arabic fonts using TypeFace or there is some better way to achieve this?

我也想知道如何删除自定义字体,以便通过代码再次获得默认字体.我只想知道这样做的可能性.

And also I want to know how to remove custom fonts in order to get default font back again through code. I just want to know what are the possibilities to do this.

推荐答案

例如,如果您希望您的应用程序同时支持两种英语 和阿拉伯字符串(除了默认字符串), 您可以简单地另外创建两个 资源目录称为/res/values-en(用于英语strings.xml), /res/values-ar(用于阿拉伯语strings.xml).

for example if you want your application to support both English and Arabic strings (in addition to the default strings), you can simply create two additional resource directories called /res/values-en (for the English strings.xml) and /res/values-ar (for the Arabic strings.xml).

strings.xml文件中, 资源名称相同.

Within the strings.xml files, the resource names are the same.

例如,/res/values-en/strings.xml文件可以 看起来像这样:

For example, the /res/values-en/strings.xml file could look like this:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello in English!</string>
</resources>

/res/values-ar/strings.xml文件如下所示:

Whereas, the /res/values-ar/strings.xml file would look like this:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">مرحبا في اللغة الإنجليزية</string>
</resources>

而且,/res/values-ur_IN/strings.xml文件对于urdu来说看起来像这样:

also , the /res/values-ur_IN/strings.xml file would look like this for urdu:

印度的ur_IN巴基斯坦的ur_PK

ur_IN for india ur_PK for pakisthan

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">انگریزی میں خوش!!</string>
</resources>

/res/layout目录中显示字符串的默认布局文件是指 字符串由变量名称@ string/hello决定,与哪种语言或目录无关 字符串资源在其中.

A default layout file in the /res/layout directory that displays the string refers to the string by the variable name @string/hello, without regard to which language or directory the string resource is in.

Android操作系统确定哪个版本的 在运行时加载的字符串(法语,英语或默认值).带有TextView控件的布局 显示字符串可能看起来像这样:

The Android operating system determines which version of the string (French, English, or default) to load at runtime.A layout with a TextView control to display the string might look like this:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello" >
</LinearLayout>

可以通过常规方式以编程方式访问该字符串:

The string is accessed programmatically in the normal way:

String str = getString(R.string.hello);

要更改语言,您需要喜欢该更改语言.

For change the language you need to like that change lang..

btn_english.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Locale locale = new Locale("en"); 
                  Locale.setDefault(locale);
                  Configuration config = new Configuration();
                  config.locale = locale;
                  getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
                  Toast.makeText(this, getResources().getString(R.string.lbl_langSelectEnglis), Toast.LENGTH_SHORT).show();

            }
        });



 btn_arbice.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                 Locale locale = new Locale("ar"); 
                  Locale.setDefault(locale);
                  Configuration config = new Configuration();
                  config.locale = locale;
                  getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
                  Toast.makeText(this, getResources().getString(R.string.lbl_langSelecURdu), Toast.LENGTH_SHORT).show();

            }
        });


 btn_urdu.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Locale locale = new Locale("ur_IN"); 
                  Locale.setDefault(locale);
                  Configuration config = new Configuration();
                  config.locale = locale;
                  getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
                  Toast.makeText(HomeActivity.this, getResources().getString(R.string.lbl_langSelectEnglis), Toast.LENGTH_SHORT).show();

            }
        });

也请参见此示例以了解单屏

Also see this example for single screen

基于字符串内部语言的TextView自定义字体

字符串段落=嘿whatعيف怎么了"; int NO_FLAG = 0; Bidi bidi =新的Bidi(段落,NO_FLAG); int runCount = bidi.getRunCount(); for(int i = 0; i< runCount; i ++){ 字符串ltrtl = bidi.getRunLevel(i)%2 == 0吗? "ltr":"rtl"; 字符串subString = paragraph.substring(bidi.getRunStart(i),bidi.getRunLimit(i)); Log.d(">> bidi:" + i,subString +是" + ltrtl); }

String paragraph = "hey what's up ضعيف"; int NO_FLAG = 0; Bidi bidi = new Bidi(paragraph, NO_FLAG); int runCount = bidi.getRunCount(); for (int i = 0; i < runCount; i++) { String ltrtl = bidi.getRunLevel(i) % 2 == 0 ? "ltr" : "rtl"; String subString = paragraph.substring(bidi.getRunStart(i), bidi.getRunLimit(i)); Log.d(">>bidi:" + i, subString+" is "+ltrtl); }

打印:

嘿,这是ltr

hey what's up is ltr

ضعيف是rtl

因此,现在人们可以像这样根据语言方向轻松构建TypefaceSpanMetricAffectingSpan:

So now one can easily build TypefaceSpan or MetricAffectingSpan based on language direction like this:

SpannableString spanString = new SpannableString(paragraph);
for (int i = 0; i < runCount; i++) {
    Object span = bidi.getRunLevel(i) % 2 == 0 ? ltrFontSpan : rtlFontSpan;
    spanString.setSpan(span, bidi.getRunStart(i), bidi.getRunLimit(i), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
}
textView.setText(spanString);

这篇关于在单个屏幕上以多种语言显示的Android字体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆