0

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

我想更改阿拉伯语文本的字体,如果我在整个应用程序中应用字体,它也会改变乌尔都语和英语的外观。那么,仅使用 TypeFace 将字体应用于包含阿拉伯字体的每个 textview 是否可以,或者有更好的方法来实现这一点?

而且我还想知道如何删除自定义字体,以便通过代码再次获取默认字体。我只想知道这样做的可能性是什么。

4

1 回答 1

1

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

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

例如,该/res/values-en/strings.xml文件可能如下所示:

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

而 /res/values-ar/strings.xml 文件看起来像这样:

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

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

ur_IN 代表印度 ur_PK 代表巴基斯坦

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

/res/layout 目录中显示字符串的默认布局文件通过变量名称@string/hello 引用字符串,而与字符串资源所在的语言或目录无关。

Android 操作系统决定在运行时加载哪个版本的字符串(法语、英语或默认)。带有 TextView 控件以显示字符串的布局可能如下所示:

<?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>

以正常方式以编程方式访问字符串:

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

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

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();

            }
        });

另请参阅此示例以了解单屏

基于 String 中语言的 TextView 自定义字体

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

印刷:

嘿,怎么回事是 ltr

ضعيف 是 rtl

因此,现在可以轻松地构建TypefaceSpanMetricAffectingSpan基于这样的语言方向:

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);
于 2016-08-25T12:24:00.030 回答