Я пытаюсь построить арабскую строку, содержащую пространственные символы с разным цветом, текст должен быть черным и специальными символами красного цвета и разным размером между предложениями. Как это:SpannableStringBuilder setSpan не работает с текстом на арабском языке
Это мое определение TexView:
<com.neopixl.pixlui.components.textview.TextView
android:id="@+id/sura"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/kuran_sure_text_size"
android:textDirection="rtl"
pixlui:typeface="fatih_araz_font.ttf"/>
И это мой код:
SpannableStringBuilder ssb = new SpannableStringBuilder();
for (int i = 0; i < contentJsonArray.length(); ++i) {
JSONObject suraJson = (JSONObject)contentJsonArray.get(i);
Log.d(LOG_TAG, "QuranPageFragment - WebServiceClient.getVerse - success - " +
"Content " + i + " = " + suraJson.toString());
ssb.append(suraJson.getString(KEY_VERSE));
int start = ssb.length();
if (i == contentJsonArray.length() - 1)
break;
// This has to be red and small but it doesn't
ssb.append(" (#) ");
ssb.setSpan(new ForegroundColorSpan(R.color.Red), start, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new AbsoluteSizeSpan(10, true), start, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
Log.d(LOG_TAG, "QuranPageFragment - WebServiceClient.getVerse - success - Sura = " + ssb.toString());
suraTextView.setText(ssb, TextView.BufferType.SPANNABLE);
Я попытался решения следующего вопроса, но до сих пор не могу make " (#) "
красный и маленький:
SpannableStringBuilder to create String with multiple fonts/text sizes etc Example?
Может ли кто-нибудь мне помочь?
UPDATE:
Ни один из них не делает текст красным:
ssb.setSpan(new ForegroundColorSpan(0xFF0000), start, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new ForegroundColorSpan(0xFF0000), start, ssb.length(), 0);
ssb.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.Red)), start, ssb.length(), 0);
Это тоже не работает:
SpannableStringBuilder ssb = new SpannableStringBuilder();
for (int i = 0; i < contentJsonArray.length(); ++i) {
JSONObject suraJson = (JSONObject)contentJsonArray.get(i);
Log.d(LOG_TAG, "QuranPageFragment - WebServiceClient.getVerse - success - " +
"Content " + i + " = " + suraJson.toString());
Spannable spannable = new SpannableString(suraJson.getString(KEY_VERSE) + " (#) ");
if (i == contentJsonArray.length() - 1)
break;
spannable.setSpan(
new ForegroundColorSpan(
getResources().getColor(R.color.Red)),
spannable.length() - 5,
spannable.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(
new AbsoluteSizeSpan(10, true),
spannable.length() - 5,
spannable.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.append(spannable);
}
Log.d(LOG_TAG, "QuranPageFragment - WebServiceClient.getVerse - success - Sura = " + ssb.toString());
suraTextView.setText(ssb);
РЕШИТЬ:
Я решилЭто. Проблема была в библиотеке PixUI
, с которой я загружал свой собственный арабский шрифт. Когда я его удалил, setSpan работал. Я загрузил библиотеку Calligraphy
, чтобы загрузить свой собственный шрифт.
После кода и разметки работает отлично:
<TextView
android:id="@+id/sura"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/kuran_sure_text_size"
android:textDirection="rtl"/>
SpannableStringBuilder ssb = new SpannableStringBuilder();
for (int i = 0; i < contentJsonArray.length(); ++i) {
JSONObject suraJson = (JSONObject)contentJsonArray.get(i);
Log.d(LOG_TAG, "QuranPageFragment - WebServiceClient.getVerse - success - " +
"Content " + i + " = " + suraJson.toString());
ssb.append(suraJson.getString(KEY_VERSE));
if (i == contentJsonArray.length() - 1)
break;
int start = ssb.length();
ssb.append(" (#) ");
ssb.setSpan(new ForegroundColorSpan(R.color.Red), start, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new AbsoluteSizeSpan(10, true), start, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
Log.d(LOG_TAG, "QuranPageFragment - WebServiceClient.getVerse - success - Sura = " + ssb.toString());
CalligraphyTypefaceSpan typefaceSpan =
new CalligraphyTypefaceSpan(
TypefaceUtils.load(getActivity().getAssets(),
"fonts/fatih_araz_font.ttf"));
ssb.setSpan(typefaceSpan, 0, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
suraTextView.setText(ssb);
Результат:
@pskink вы были правы насчет цветового кода. Он должен быть в форме 0xAARRGGBB
чем проблема? – Blackbelt
Что означает «Не работает»? расскажите нам о проблеме, с которой вы столкнулись. Поделитесь трассировкой logcat, если вы получите какую-либо ошибку. –
'R.color.Red' ошибочно, это должно быть что-то вроде 0xAARRGGBB целого числа, а не цветного идентификатора – pskink