Расстановка переносов в Android

В рамках интернационализации Android-приложения я столкнулся с необходимостью динамического переноса слов или переноса слов в нужное место.

Все мои строки вынесены в файлы strings.xml, но я не нашел документации о переносах в Android.

Я хотел бы предложить варианты расстановки переносов, аналогичные тому, как я могу это сделать в LaTeX:

http://en.wikipedia.org/wiki/Hyphenation_algorithm

Но я не нашел никаких указаний на то, возможно ли это. Что-то в рамках я упустил? Что делают другие люди, например с японскими строками, у которых нет очевидной позиции, чтобы разбить предложение? Вы просто добавляете пробелы в правильных местах?

Я мог динамически изменять размер шрифта, чтобы он соответствовал определенным макетам, но для более длинных сообщений, которые занимают несколько строк, это не сработает. Что делать?


person Manfred Moser    schedule 15.12.2010    source источник
comment
Уважает ли Android символ мягкого дефиса? (U + 00AD)   -  person Anon.    schedule 16.12.2010
comment
У меня были аналогичные проблемы с корейским и другими языками, где отдельные слова огромны. Так заинтересован в ответе. Один вопрос может заключаться в том, допустимо ли вообще разорвать это слово?   -  person Emile    schedule 16.12.2010
comment
@anon .. да, мягкий дефис может быть интересным. Я проверю это.   -  person Manfred Moser    schedule 16.12.2010
comment
@Emile ну ... Я не знаю достаточно о японском или корейском, но было бы, конечно, странно поставить это слово на первое место в других языках ... но было бы хорошо знать.   -  person Manfred Moser    schedule 16.12.2010
comment
Латекс дал возможность подсказывать, как разделять слова. Я действительно не помню название, но я бы поискал, как это сделать в латексе, и проверить, работает ли он на android.   -  person Macarse    schedule 17.12.2010
comment
Это не работает. Может, мягкий дефис сработает. Еще надо попробовать.   -  person Manfred Moser    schedule 17.12.2010
comment
@ Манфред Мозер: есть ли успех с мягким дефисом?   -  person Thomas Ahle    schedule 03.09.2011
comment
Нет, мне с этим не повезло.   -  person Manfred Moser    schedule 03.09.2011
comment
Мягкий дефис работает в Android 4.4, не работает в 4.2. Хотелось бы узнать, работает ли это в 4.3, это то, что я надеялся узнать на этой странице.   -  person arnt    schedule 21.10.2014
comment
@arnt См. мой ответ. Android 4.3, похоже, поддерживает его, по крайней мере, на устройствах SAMSUNG.   -  person OneWorld    schedule 04.02.2016
comment
SDK 17: ни \ u00AD, ни \ u200B не работает. SDK 19: разбивает слово без символа дефиса. SDK 24 -> правильная расстановка переносов, разбивает слово без символа дефиса.   -  person Leos Literak    schedule 30.12.2016
comment
А от html будет ли работать на Андроиде?   -  person aleksandrbel    schedule 03.07.2018


Ответы (6)


Это новинка от Android 6 Marshmellow.

Попробуйте добавить это в свой TextView xml

android:hyphenationFrequency="none"
person Athul    schedule 21.09.2017
comment
В Android Q up по умолчанию установлено значение none. Раньше этого не было. - person Malachiasz; 08.05.2019
comment
Я хочу добавить setHyphenationFrequency (int) - person ; 29.01.2020
comment
По умолчанию в Android Q расстановка переносов отключена для повышения производительности. Если вам это нужно, вам нужно включить его. android-developers.googleblog. ru / 2019/07 / - person Ishaan Kumar; 03.05.2021

Управление переносом строки может быть проблемой. Лучшим вариантом является использование управляющих символов модификатора разрыва строки UTF, поскольку Android поддерживает полный UTF.

Я знаю, что кто-то упомянул «мягкий дефис», но их довольно много.

Вы также можете использовать «Пробел нулевой ширины» между словами на языках, в которых отсутствуют пробелы, поэтому вам не нужно полагаться на толкование словаря. Вы также можете использовать это как мягкий дефис в языках, которые позволяют переносить определенные слова поверх строк в определенных точках.

При использовании составного слова, которое вы не хотите разрывать, но хотите, чтобы система преобразования текста в речь правильно распознавала его, вы должны использовать символ «Разделитель слов». Не используйте «Неразрывный интервал нулевой ширины», так как он устарел из-за его использования в качестве спецификации.

Наконец, если вам нужен пробел, но не нужен разрыв строки, используйте простой неразрывный пробел.

person Robert Wm Ruedisueli    schedule 09.09.2012
comment
Успешно используется для этого в файле ресурсов xml со строками - person mach; 03.11.2015
comment
Мягкие дефисы - чрезвычайно полезный инструмент, работающий в API 21 таргетинга Android - \ u00AD en.wikipedia.org/wiki / Soft_hyphen - person CrimsonX; 27.01.2018
comment
Как и на любой платформе, доступность общих и горячих клавиш, используемых в HTML, зависит от того, где они используются в приложении. Некоторые виджеты пропускают свой текст через анализатор, который их обрабатывает, некоторые - нет. Если вы используете функции таблицы строк интернационализации для обработки строк (что вам абсолютно необходимо), вы можете использовать UTF. - person Robert Wm Ruedisueli; 08.07.2018

Мягкий дефис работал на устройстве Samsung Galaxy, начиная с Android 4.3.

<!-- key combination to enter soft hyphen: [Alt Gr]+[-] or [Alt]+240 on German PC, see https://de.wikipedia.org/wiki/Weiches_Trennzeichen#Darstellung_auf_Computersystemen -->
<string name="no_connection">Nicht ver-bund-en</string>

введите описание изображения здесь

Поскольку мой вариант использования был довольно узким, я просто использовал один мягкий дефис в слове «verbunden». Unicode \ u00ad не повлиял.

person OneWorld    schedule 04.02.2016
comment
Я не следил за duden, чтобы правильно разделить слово. ;) - person OneWorld; 04.02.2016
comment
Может быть, вам стоит использовать \ u00AD (заглавные буквы на 2 последних позициях) ... для меня это отлично работает! Спасибо! - person Geryson; 17.11.2017

Следующая библиотека поддерживает расстановку переносов. Он выполняет все типы выравнивания текста (влево / вправо / по центру / по ширине) и расстановку переносов за вас. Не все языки были добавлены, но могут быть добавлены при необходимости. В этой библиотеке используются БЕЗ ВЕБ-ПРОСМОТРА и ПОДДЕРЖКА ОБЪЕКТОВ, а также допускается использование ДЛИННЫЙ ТЕКСТ.

БИБЛИОТЕКА: https://github.com/bluejamesbond/TextJustify-Android

ANDROID: от 2,2 до 5.X

НАСТРОЙКА

DocumentView documentView = addDocumentView(new StringBuilder("Your long text content"), DocumentView.PLAIN_TEXT);
documentView.getDocumentLayoutParams().setTextAlignment(TextAlignment.JUSTIFIED);
documentView.getDocumentLayoutParams().setHyphenator(new Hyphenator(HyphenPattern.PT));
documentView.getDocumentLayoutParams().setHyphenated(true);
person Mathew Kurian    schedule 14.01.2015
comment
Как мы можем установить это свойство в textView ?. Не могли бы вы изменить это. - person Nithinjith; 27.10.2016

Вопрос старый, но я нашел лучшее решение для меня:

Я должен сказать, что я программирую на Xamarin, поэтому код написан на C #, но не должно быть проблем с переносом на java.

Я использовал логику NHyphenator (https://github.com/alkozko/NHyphenator) для вставки SoftHyphens ( Символ UTF8 - 0x00AD), поэтому Textview расставляет переносы в нужном месте.

Чтобы получить расстановку переносов для других языков, я использовал словари openoffice. например мне нужно было поставить перенос для немецко-швейцарского языка

http://extensions.openoffice.org/en/search?f[0pting=field_project_tags%3A157 1. Загрузите расширение 2. Разархивируйте его с помощью winrar или чего-то еще 3. Скопируйте файл hyph_xx_xx / hyph_xx_xx.dic 4. Добавьте новый язык в класс Hyphenator

Файлы ресурсов NHyphernator объявлены как: hyph-xx-xx.pat.txt -> содержимое файла dic без комментариев hyph-xx-xx.hyp.txt -> файл, который содержит исключения слов, в которых используется логика расстановки переносов не давать правильных результатов

Если кому-то нужна портативная библиотека для Xamarin, просто скажите, я могу ее загрузить.

РЕДАКТИРОВАТЬ:

В TExtview для параметра breakstrategy должно быть установлено значение "Сбалансированный". Уровень API> 23, иначе не используйте стратегию прерывания.

РЕДАКТИРОВАТЬ:

Вот код моно / xamarin: https://github.com/sma84/NHyphenator-Mono

person user1519979    schedule 11.11.2016
comment
Можно ли загрузить переносную библиотеку для Xamarin? - person Huby; 04.01.2017
comment
только что загрузил. en_gb, en_us, rus и de_ch добавлены прямо сейчас. Добавил в ридми как добавить новый язык. github.com/sma84/NHyphenator-Mono - person user1519979; 04.01.2017

setEllipsize может быть справки, если эта ошибка еще исправлена.

person iarwain01    schedule 15.12.2010
comment
Хотя в некоторых случаях это помогает, я действительно хочу, чтобы весь текст был виден, но просто переносился / переносился в нужном месте ... - person Manfred Moser; 16.12.2010
comment
Я еще не использовал многоточие, но подумал, что он показывает весь текст. Но понятия не имею о переносе в желаемом месте. - person iarwain01; 16.12.2010