2015-06-17 1 views
0

Я пытаюсь построить арабскую строку, содержащую пространственные символы с разным цветом, текст должен быть черным и специальными символами красного цвета и разным размером между предложениями. Как это:SpannableStringBuilder setSpan не работает с текстом на арабском языке

enter image description here

Это мое определение 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); 

Результат:

enter image description here

@pskink вы были правы насчет цветового кода. Он должен быть в форме 0xAARRGGBB

+0

чем проблема? – Blackbelt

+0

Что означает «Не работает»? расскажите нам о проблеме, с которой вы столкнулись. Поделитесь трассировкой logcat, если вы получите какую-либо ошибку. –

+1

'R.color.Red' ошибочно, это должно быть что-то вроде 0xAARRGGBB целого числа, а не цветного идентификатора – pskink

ответ

1

Использовать Calligraphy вместо PixUI. Вот Gradle для зависимых пакетов него:

compile 'uk.co.chrisjenx:calligraphy:2.1.0' 

Использование TextView не некоторые пользовательские TextView как PixUI 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"/> 

Применение пользовательских шрифтов после того, как здание получившийся текст:

SpannableStringBuilder ssb = new SpannableStringBuilder(); 

for (int i = 0; i < contentJsonArray.length(); ++i) { 
    JSONObject json = (JSONObject)contentJsonArray.get(i); 
    ssb.append(json.getString(KEY_SOME_KEY)); 

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

CalligraphyTypefaceSpan typefaceSpan = 
     new CalligraphyTypefaceSpan(
       TypefaceUtils.load(getActivity().getAssets(), 
         "fonts/some_custom_font.ttf")); 
ssb.setSpan(typefaceSpan, 0, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
textView.setText(ssb); 

Используйте код цвета для ForegroundColorSpan как 0xAARRGGBB, как @pskink предложил:

ssb.setSpan(new ForegroundColorSpan(0xFFFF0000), start, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);