2013-12-09 9 views
2

У меня есть ListView персонализированных View где у меня есть TextView:Android смешанный язык текста - BidiFormatter на строки с RTL и LTR текст

<TextView 
    android:id="@+id/textViewItemTitle" 
    android:layout_width="0dp" 
    android:layout_weight="1" 
    android:layout_height="wrap_content" 
    android:gravity="right|center_horizontal" 
    android:text="title" /> 

Этот TextView содержит текст на иврите.

if(!bidi.isRtl(event)){ 
    event = bidi.unicodeWrap(event); 
} 

holder.title.setText(String.format("%s %s %s", bidi.unicodeWrap(item.getStartTimeNoDate().trim()), event, 
bidi.unicodeWrap(item.getDuration().trim()))); 

В случае, если первый аргумент времени чч: мм: сс, второй (событие) является иврит Строка и третий, как и первый.

Проблема: некоторого времени событие Строка содержит смешанный текст на иврите и английском, как abc-אבג затем весь текст ведет себя подобно тяжесть слева (а не так, как я определил в текстовом виде), я имею в виду с отступом налево.

Как это решить?

+0

может быть, вы можете разместить скриншот для иллюстрации. Какую систему вы проверили? Реализации могут быть специфичными для OEM. –

+0

К сожалению, я не могу опубликовать скриншот, и я тестировал thta на нескольких устройствах с различными версиями Android – NickF

ответ

3

Данный ответ будет делать работу, если текст в TextView.

Могут быть случаи, когда текст смешанного языка не должен отображаться в TextView. Например, текст может быть передан в доле Intent в Gmail или WhatsApp и так далее. В таких случаях необходимо использовать комбинацию из следующих классов:

Как указано в документации, эти ...

класса Utility [es] для форматирования текста для отображения в потенциально противоположном контексте без искажения. Направленность контекста задается при создании форматирования, и направленность текста может быть оценена или передана, когда известна.

Так, например, у вас есть String, который имеет сочетание английского & арабского языка, и вам нужен текст, который будет

  • справа налево (RTL).
  • всегда выравнивание по правому краю, даже если предложение начинается с английского.
  • English & Арабские слова в правильной последовательности и без искажений.

, то вы могли бы добиться этого с помощью метода unicodeWrap() следующим образом:

String mixedLanguageText = ... // mixed-language text 

if(BidiFormatter.getInstance().isRtlContext()){ 
    Locale rtlLocale = ... // RTL locale 
    mixedLanguageText = BidiFormatter.getInstance(rtlLocale).unicodeWrap(mixedLanguageText, TextDirectionHeuristics.ANYRTL_LTR); 
} 

Это преобразовать строку в RTL и выравнивать его влево, если даже один RTL-язык символов был в строке , а в противном случае - возврат к LTR. Если вы хотите, чтобы строка была RTL, даже если она полностью включена, скажем, английский (язык LTR), вы можете использовать TextDirectionHeuristics.RTL вместо TextDirectionHeuristics.ANYRTL_LTR.

Это правильный способ обработки текста смешанного направления в отсутствие TextView. Интересно, что в качестве документации государств,

заметить также, что эти направления эвристика соответствует тем же типам констант, представленных в View классе setTextDirection(), такие как TEXT_DIRECTION_RTL.

Update:

Я только что нашел Bidi класс в Java, который, кажется, чтобы сделать что-то подобное. Поищи это!

Дополнительные ссылки:

1.Write text file mix between arabic and english.

2.Unicode Bidirectional Algorithm.

1

Я была такая же проблема, и я нацеливание API 16 Мое решение было очень простым, я добавил в начало строки «\ u200F»

String mixedLanguageText = ... // mixed-language text 
newText = "\u200F" + mixedLanguageText; 

«\ u200F» = Unicode Character «ПРАВЫЙ -TO-LEFT MARK (U + 200F)

0

следующий фрагмент кода показывает, как использовать unicodeWrap():

String mySuggestion = "15 Bay Street, Laurel, CA"; 
BidiFormatter myBidiFormatter = BidiFormatter.getInstance(); 

// The "did_you_mean" localized string resource includes 
// a "%s" placeholder for the suggestion. 
String.format(R.string.did_you_mean, 
     myBidiFormatter.unicodeWrap(mySuggestion));