@Jimbo - правильный ответ для моего случая на inputtext и textview для арабского языка справа налево для ввода и отображения, но для входного текста мне пришлось добавить также gravity = "right"
После дальнейшего анализа вы можете сделать снимок для Android: gravity = "fill_hor Horizontal". Это называется «Увеличить горизонтальный размер объекта, если это необходимо, чтобы он полностью заполнил свой контейнер», но я не знаю, как они «увеличивают» текст.
CommonsWare
8
android: gravity = "fill_horizontal" тоже не работает. Похоже, Android не поддерживает оправдание в конце концов, да ладно :)
@CommonsWare Теперь какой-нибудь правильный способ оправдать текст?
Джон Р
1
Чувак, я живу с тяжелым веб-обзором, чтобы достичь этого, и поверьте мне, мой пользовательский интерфейс требует новых вещей, которые еще не добавлены в API, потому что это чертовски медленно для таких компонентов, как чат в виде списка.
nobalG
156
Ответ @CommonsWare правильный. Android 8.0+ поддерживает «Полное обоснование» (или просто «Обоснование», как это иногда называют неоднозначно).
Android также поддерживает «выравнивание текста по левому / правому краю». См. Статью об оправдании в Википедии . Многие люди считают, что концепция «выравнивания» включает в себя полное выравнивание, а также выравнивание текста влево / вправо, что они и ищут, когда хотят выполнить выравнивание текста влево / вправо. Этот ответ объясняет, как добиться выравнивания текста влево / вправо.
Можно добиться выравнивания текста по левому / правому краю (в отличие от полного выравнивания, о чем вопрос). Для демонстрации я буду использовать базовую форму с двумя столбцами (метки в левом столбце и текстовые поля в правом столбце) в качестве примера. В этом примере текст в метках в левом столбце будет выровнен по правому краю, поэтому они будут отображаться вровень с текстовыми полями в правом столбце.
В макете XML вы можете заставить сами элементы TextView (левый столбец) выравниваться вправо, добавив следующий атрибут во все TextViews:
Однако если текст переносится на несколько строк, текст все равно будет выровнен по левому краю внутри TextView. При добавлении следующего атрибута фактический текст выравнивается по правому краю (неровно по левому краю) внутри TextView:
Таким образом, атрибут gravity определяет, как выровнять текст внутри TextView layout_gravity указывает, как выровнять / расположить сам элемент TextView.
Если я правильно понимаю, и учитывая результаты тестирования, все это делает выравнивание текста влево или вправо. Это не оправдывает текст, не так ли?
Пол Ламмерцма
14
Отлично. Просто чтобы добавить, если вы хотите, чтобы центр оправдания, вы можете сделать android:layout_gravity="center_horizontal|center"android:gravity="center".
Луис А. Флорит
определенно работает для моего случая на inputtext и textview для арабского языка справа налево ввода и отображения
shareef
1
Это просто выравнивание, а не оправдание. Прочитайте эту ссылку в Википедии внимательно. Разница между различными типами обоснования влияет только на последнюю строку абзаца. Не существует левого / правого / центрального оправдания для абзацев, которые имеют только одну строку.
Кару
тогда зачем даже отвечать здесь, если речь не justify
идет
136
Для выравнивания текста в Android я использовал WebView
<stringname="hello">
<![CDATA[<html><head></head><bodystyle="text-align:justify;color:gray;background-color:black;">
Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nunc pellentesque, urna
nec hendrerit pellentesque, risus massa</body></html>
]]></string>
Я пока не могу загрузить изображения, чтобы доказать это, но "это работает для меня".
Хорошее решение здесь. FWIW вам не нужно большинство дополнительных HTML. Достаточно тега body с выравниванием текста.
gnac
5
Это хорошо работает. Обратите внимание, что вы можете сделать фон прозрачным, следуя view.loadData()с view.setBackgroundColor("#00000000").
Пол Ламмерцма
Однако мне не удалось заставить его загрузить собственный шрифт / шрифт. Я попробовал это и это предложение, без какой-либо удачи.
Пол Ламмерцма
2
Как я уже упоминал в этих темах, я нашел решение: если вы создаете файл HTML и помещаете его в ресурсы, загрузка его с помощью view.loadUrl()работает, тогда как view.loadData()нет. Я понятия не имею, почему последний не делает.
Пол Ламмерцма
1
@PaulLammertsma, setBackgroundColor (0x00000000) скорее будет правильным форматом для установки прозрачного фона.
Ричи
100
ОБНОВЛЕНО
Для этого мы создали простой класс. В настоящее время есть два метода для достижения того, что вы ищете. Оба не требуют веб-просмотра и поддерживает поддержку .
Это действительно помогает, но, используя его, мои TextViews не сохраняют оригинальный формат, я ссылаюсь: поля, стиль текста, и я думаю, что размер текста тоже, Plese, продолжайте работать в нем, должен быть действительно большим подспорьем
Леонардо Сапуй
Ну, я не могу установить эти классы. у одного из них не было названия пакета, у другого - желтая ошибка. На самом деле я не могу доверять.
Мехмет
Хорошая библиотека, но я до сих пор не знаю, как добавить форматирование в Text с помощью этой библиотеки.
Семантик
4
Спасибо за эту замечательную общую библиотеку, но она не может поддерживать персидский или арабский текст. Когда я устанавливаю направление, мое слово рисует от последнего до начала, а не от начала до последнего. Я имею в виду это: мое Слово это: "سلام" и его ничья, как это: "مالس". (если вы не понимаете персидский, посмотрите этот пример: позвольте мне «1234» -> «4321»)
Наруто Узумаки
1
Основанный на scrollView ... Хорошее решение, однако, не может найти еще какой-либо ответ, который делает его возможным с textview. :(
superUser
89
TextViewв Android Oпредлагает полное оправдание (новое типографское выравнивание) себя.
Будем надеяться, что он будет перенесен обратно в библиотеку поддержки, затем O :)
Stefan Haustein
2
Пожалуйста, добавьте библиотеку здесь!
Кунал Дхарайя
4
как оправдать использование XML?
Викаш Параджули
14
Вы можете использовать Android: justificationMode = "inter_word" в XML.
Кристиан Д.
5
API 26 требуется для Android: justificationMode.
Бинк
42
Вы можете использовать проект JustifiedTextView for Android в github. это пользовательский вид, имитирующий оправданный текст для вас. Он поддерживает Android 2.0+ и справа налево языки.
Привет Saeed, tnx за вашу помощь, есть ли способ поддержать расширяемые текстовые представления ?!
Хамид Реза
@SaeedZarinfam Я пытался использовать «JustifiedTextView для Android», но у меня возникла ошибка в теге xml ir.noghteh.JustifiedTextView. Помогите мне, пожалуйста, по этому вопросу stackoverflow.com/questions/37911376/…
Jumong
30
Я пишу базу виджетов на родном textview, чтобы сделать это.
Я бы порекомендовал этот, главным образом потому, что он основан на оригинальном текстовом представлении официального Android SDK, который, по моему личному мнению, намного легче, чем метод веб-просмотра, который многие публикуют по этой общей теме. Если вы создаете приложение, которое требует разумного использования памяти, например, с использованием объектов списка, вы можете рассмотреть возможность использования чего-то подобного. Ï уже опробовать, и работает как положено. Если вы, люди, знаете другого лучше, как этот 1, пожалуйста, поделитесь своим опытом со мной.
superUser
Хорошая работа, кстати. Что я искал
superUser
5
не поддерживает языки RTL, такие как персидский
стрельба в дыре
1
@Frank Cheng Очень Полезная Библиотека. Я получаю много пробелов в конце абзаца. Как я могу это исправить?
iSrinivasan27
1
работал для меня, но последняя строка textview была обрезана. Я должен был продолжать добавлять 5 для просмотра текста.
TharakaNirmana
23
Я нашел способ решить эту проблему, но это может быть не очень благодати, но эффект не плохой.
Его принцип заключается в замене пробелов каждой строки на ImageSpan фиксированной ширины (цвет прозрачный).
WebView view =(WebView) findViewById(R.id.textContent);String text;
text ="<html><body><p align=\"justify\">";
text+="This is the text will be justified when displayed!!!";
text+="</p></body></html>";
view.loadData(text,"text/html","utf-8");
Это может решить вашу проблему. Это полностью сработало для меня.
Вот как я это сделал, я думаю, самый элегантный способ, которым я мог. С этим решением единственные вещи, которые вам нужно сделать в ваших макетах:
добавить дополнительную xmlnsдекларацию
изменить TextViewисходное текстовое пространство имен с Android на новое пространство имен
заменить ваши TextViewсx.y.z.JustifiedTextView
Вот код Отлично работает на моих телефонах (Galaxy Nexus Android 4.0.2, Galaxy Teos Android 2.1). Не стесняйтесь, конечно, заменить имя моего пакета на ваше.
/assets/justified_textview.css :
body {
font-size:1.0em;
color: rgb(180,180,180);
text-align: justify;}@media screen and(-webkit-device-pixel-ratio:1.5){/* CSS for high-density screens */
body {
font-size:1.05em;}}@media screen and(-webkit-device-pixel-ratio:2.0){/* CSS for extra high-density screens */
body {
font-size:1.1em;}}
Нам нужно настроить рендеринг на программное обеспечение, чтобы получить прозрачный фон на Android 3+. Отсюда и попытка поймать старые версии Android.
Надеюсь это поможет!
PS: пожалуйста, помните, что было бы полезно добавить это к вашей активности на Android 3+, чтобы получить ожидаемое поведение: android:hardwareAccelerated="false"
Несмотря на то, что вы еще не завершили выровненный текст, теперь вы можете балансировать длины строк, используя android:breakStrategy="balanced"API 23 и выше
Добавьте вышеупомянутый класс в вашу папку src и используйте этот пример кода, чтобы добавить в свой макет:
JustifiedTextView jtv=newJustifiedTextView(getApplicationContext(),"Lorem ipsum dolor sit amet... ");LinearLayout place =(LinearLayout) findViewById(R.id.book_profile_content);
place.addView(jtv);
publicclassTextViewExextendsTextView{privatePaint paint =newPaint();privateString[] blocks;privatefloat spaceOffset =0;privatefloat horizontalOffset =0;privatefloat verticalOffset =0;privatefloat horizontalFontOffset =0;privatefloat dirtyRegionWidth =0;privateboolean wrapEnabled =false;int left, top, right, bottom =0;privateAlign _align =Align.LEFT;privatefloat strecthOffset;privatefloat wrappedEdgeSpace;privateString block;privateString wrappedLine;privateString[] lineAsWords;privateObject[] wrappedObj;privateBitmap cache =null;privateboolean cacheEnabled =false;publicTextViewEx(Context context,AttributeSet attrs,int defStyle){super(context, attrs, defStyle);// set a minimum of left and right padding so that the texts are not too// close to the side screen// this.setPadding(10, 0, 10, 0);}publicTextViewEx(Context context,AttributeSet attrs){super(context, attrs);// this.setPadding(10, 0, 10, 0);}publicTextViewEx(Context context){super(context);// this.setPadding(10, 0, 10, 0);}@Overridepublicvoid setPadding(int left,int top,int right,int bottom){// TODO Auto-generated method stubsuper.setPadding(left +10, top, right +10, bottom);}@Overridepublicvoid setDrawingCacheEnabled(boolean cacheEnabled){this.cacheEnabled = cacheEnabled;}publicvoid setText(String st,boolean wrap){
wrapEnabled = wrap;super.setText(st);}publicvoid setTextAlign(Align align){
_align = align;}@SuppressLint("NewApi")@Overrideprotectedvoid onDraw(Canvas canvas){// If wrap is disabled then,// request original onDrawif(!wrapEnabled){super.onDraw(canvas);return;}// Active canas needs to be set// based on cacheEnabledCanvas activeCanvas =null;// Set the active canvas based on// whether cache is enabledif(cacheEnabled){if(cache !=null){// Draw to the OS provided canvas// if the cache is not empty
canvas.drawBitmap(cache,0,0, paint);return;}else{// Create a bitmap and set the activeCanvas// to the one derived from the bitmap
cache =Bitmap.createBitmap(getWidth(), getHeight(),Config.ARGB_4444);
activeCanvas =newCanvas(cache);}}else{// Active canvas is the OS// provided canvas
activeCanvas = canvas;}// Pull widget properties
paint.setColor(getCurrentTextColor());
paint.setTypeface(getTypeface());
paint.setTextSize(getTextSize());
paint.setTextAlign(_align);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);// minus out the paddings pixel
dirtyRegionWidth = getWidth()- getPaddingLeft()- getPaddingRight();int maxLines =Integer.MAX_VALUE;int currentapiVersion = android.os.Build.VERSION.SDK_INT;if(currentapiVersion >= android.os.Build.VERSION_CODES.JELLY_BEAN){
maxLines = getMaxLines();}int lines =1;
blocks = getText().toString().split("((?<=\n)|(?=\n))");
verticalOffset = horizontalFontOffset = getLineHeight()-0.5f;// Temp// fix
spaceOffset = paint.measureText(" ");for(int i =0; i < blocks.length && lines <= maxLines; i++){
block = blocks[i];
horizontalOffset =0;if(block.length()==0){continue;}elseif(block.equals("\n")){
verticalOffset += horizontalFontOffset;continue;}
block = block.trim();if(block.length()==0){continue;}
wrappedObj =TextJustifyUtils.createWrappedLine(block, paint,
spaceOffset, dirtyRegionWidth);
wrappedLine =((String) wrappedObj[0]);
wrappedEdgeSpace =(Float) wrappedObj[1];
lineAsWords = wrappedLine.split(" ");
strecthOffset = wrappedEdgeSpace !=Float.MIN_VALUE ? wrappedEdgeSpace
/(lineAsWords.length -1):0;for(int j =0; j < lineAsWords.length; j++){String word = lineAsWords[j];if(lines == maxLines && j == lineAsWords.length -1){
activeCanvas.drawText("...", horizontalOffset,
verticalOffset, paint);}elseif(j ==0){// if it is the first word of the line, text will be drawn// starting from right edge of textviewif(_align ==Align.RIGHT){
activeCanvas.drawText(word, getWidth()-(getPaddingRight()), verticalOffset, paint);// add in the paddings to the horizontalOffset
horizontalOffset += getWidth()-(getPaddingRight());}else{
activeCanvas.drawText(word, getPaddingLeft(),
verticalOffset, paint);
horizontalOffset += getPaddingLeft();}}else{
activeCanvas.drawText(word, horizontalOffset,
verticalOffset, paint);}if(_align ==Align.RIGHT)
horizontalOffset -= paint.measureText(word)+ spaceOffset
+ strecthOffset;else
horizontalOffset += paint.measureText(word)+ spaceOffset
+ strecthOffset;}
lines++;if(blocks[i].length()>0){
blocks[i]= blocks[i].substring(wrappedLine.length());
verticalOffset += blocks[i].length()>0? horizontalFontOffset
:0;
i--;}}if(cacheEnabled){// Draw the cache onto the OS provided// canvas.
canvas.drawBitmap(cache,0,0, paint);}}}
Теперь, если вы используете обычный textView, как:
На Android, чтобы выровнять текст по левому краю и не иметь усечения цвета фона, попробуйте это, это сработало для меня, производя согласованные результаты на Android, FF, т.е. и Chrome, но вы должны измерить пространство, оставшееся между текстом при расчете заполнения.
Android пока не поддерживает полное обоснование. Мы можем использовать Webview и обосновать HTML вместо использования textview. Это работает так хорошо. Если вы, ребята, не ясно, не стесняйтесь спрашивать меня :)
Нет, это центрирует текст. Это не оправдывает это. Цитируя Википедию : «В выровненном тексте пробелы между словами и, в меньшей степени, между глифами или буквами (кернинг) растягиваются или иногда сжимаются, чтобы выровнять текст по левому и правому краям».
CommonsWare
текст не соответствует вашему коду, а центрирует текст по горизонтали
Ответы:
Я не верю, что Android поддерживает полное оправдание.
ОБНОВЛЕНИЕ 2018-01-01 : Android 8.0+ поддерживает режимы выравнивания с
TextView
.источник
Ответ @CommonsWare правильный. Android 8.0+ поддерживает «Полное обоснование» (или просто «Обоснование», как это иногда называют неоднозначно).
Android также поддерживает «выравнивание текста по левому / правому краю». См. Статью об оправдании в Википедии . Многие люди считают, что концепция «выравнивания» включает в себя полное выравнивание, а также выравнивание текста влево / вправо, что они и ищут, когда хотят выполнить выравнивание текста влево / вправо. Этот ответ объясняет, как добиться выравнивания текста влево / вправо.
Можно добиться выравнивания текста по левому / правому краю (в отличие от полного выравнивания, о чем вопрос). Для демонстрации я буду использовать базовую форму с двумя столбцами (метки в левом столбце и текстовые поля в правом столбце) в качестве примера. В этом примере текст в метках в левом столбце будет выровнен по правому краю, поэтому они будут отображаться вровень с текстовыми полями в правом столбце.
В макете XML вы можете заставить сами элементы TextView (левый столбец) выравниваться вправо, добавив следующий атрибут во все TextViews:
Однако если текст переносится на несколько строк, текст все равно будет выровнен по левому краю внутри TextView. При добавлении следующего атрибута фактический текст выравнивается по правому краю (неровно по левому краю) внутри TextView:
Таким образом, атрибут gravity определяет, как выровнять текст внутри TextView layout_gravity указывает, как выровнять / расположить сам элемент TextView.
источник
android:layout_gravity="center_horizontal|center"
android:gravity="center"
.justify
Для выравнивания текста в Android я использовал WebView
и HTML.
Я пока не могу загрузить изображения, чтобы доказать это, но "это работает для меня".
источник
view.loadData()
сview.setBackgroundColor("#00000000")
.view.loadUrl()
работает, тогда какview.loadData()
нет. Я понятия не имею, почему последний не делает.ОБНОВЛЕНО
Для этого мы создали простой класс. В настоящее время есть два метода для достижения того, что вы ищете. Оба не требуют веб-просмотра и поддерживает поддержку .
БИБЛИОТЕКА : https://github.com/bluejamesbond/TextJustify-Android
ПОДДЕРЖКА : Android 2.0 до 5.X
НАСТРОИТЬ
СКРИНШОТ
источник
TextView
вAndroid O
предлагает полное оправдание (новое типографское выравнивание) себя.Вам просто нужно сделать это:
Котлин
Ява
по умолчанию
JUSTIFICATION_MODE_NONE
.источник
Вы можете использовать проект JustifiedTextView for Android в github. это пользовательский вид, имитирующий оправданный текст для вас. Он поддерживает Android 2.0+ и справа налево языки.
источник
Я пишу базу виджетов на родном textview, чтобы сделать это.
GitHub
источник
Я нашел способ решить эту проблему, но это может быть не очень благодати, но эффект не плохой.
Его принцип заключается в замене пробелов каждой строки на ImageSpan фиксированной ширины (цвет прозрачный).
Я положил код на GitHub: https://github.com/twiceyuan/TextJustification
Обзор:
источник
XML-макет: объявите WebView вместо TextView
Java-код: установить текстовые данные в WebView
Это может решить вашу проблему. Это полностью сработало для меня.
источник
Вот как я это сделал, я думаю, самый элегантный способ, которым я мог. С этим решением единственные вещи, которые вам нужно сделать в ваших макетах:
xmlns
декларациюTextView
исходное текстовое пространство имен с Android на новое пространство именTextView
сx.y.z.JustifiedTextView
Вот код Отлично работает на моих телефонах (Galaxy Nexus Android 4.0.2, Galaxy Teos Android 2.1). Не стесняйтесь, конечно, заменить имя моего пакета на ваше.
/assets/justified_textview.css :
/res/values/attrs.xml :
/res/layout/test.xml :
/src/net/bicou/myapp/widget/JustifiedTextView.java :
Нам нужно настроить рендеринг на программное обеспечение, чтобы получить прозрачный фон на Android 3+. Отсюда и попытка поймать старые версии Android.
Надеюсь это поможет!
PS: пожалуйста, помните, что было бы полезно добавить это к вашей активности на Android 3+, чтобы получить ожидаемое поведение:
android:hardwareAccelerated="false"
источник
Очень просто Мы можем сделать это в файле XML
источник
Несмотря на то, что вы еще не завершили выровненный текст, теперь вы можете балансировать длины строк, используя
android:breakStrategy="balanced"
API 23 и вышеhttp://developer.android.com/reference/android/widget/TextView.html#attr_android:breakStrategy
источник
Я пишу свой собственный класс, чтобы решить эту проблему, Вот только вы должны вызвать статическую функцию justify, которая принимает два аргумента
//Основная деятельность
// TextJustificationClass
// XML
источник
FILL_HORIZONTAL
эквивалентноCENTER_HORIZONTAL
. Вы можете увидеть этот фрагмент кода в исходном коде textview:источник
Существует CustomView для этой проблемы, это настраиваемое текстовое представление поддерживает Justered Text View.
Взгляните на это: JustifiedTextView
Добавьте вышеупомянутый класс в вашу папку src и используйте этот пример кода, чтобы добавить в свой макет:
источник
смотрите здесь в GitHub
Просто импортируйте два файла "TextJustifyUtils.java" и "TextViewEx.java" в ваш проект.
а также
Теперь, если вы используете обычный textView, как:
Просто использовать
Определите переменную и установите justify на true,
источник
Android Text Justify For TextView XML
Просто Android-текст оправдать использование в XML. Вы можете просто реализовать в виджете textview.
По умолчанию
android:justificationMode="none"
источник
Я думаю, что есть два варианта:
Используйте что-то вроде Pango, который специализируется на этом через NDK, и визуализируйте текст на OpenGL или другой поверхности.
Используйте Paint.measureText () и друзей, чтобы получить длины слов и выложить их вручную на холсте в пользовательском представлении.
источник
На Android, чтобы выровнять текст по левому краю и не иметь усечения цвета фона, попробуйте это, это сработало для меня, производя согласованные результаты на Android, FF, т.е. и Chrome, но вы должны измерить пространство, оставшееся между текстом при расчете заполнения.
Хак это то,
padding-right:1000px;
что толкает текст в крайнее левое положение.Любая попытка влево или выровнять код в CSS или HTML приводит к фону, который имеет только половинную ширину.
источник
Для форматирования HTML вам не нужно вызывать Webkit, вы можете использовать
Html.fromHtml(text)
для выполнения этой работы.Источник: http://developer.android.com/guide/topics/resources/string-resource.html
источник
Android пока не поддерживает полное обоснование. Мы можем использовать Webview и обосновать HTML вместо использования textview. Это работает так хорошо. Если вы, ребята, не ясно, не стесняйтесь спрашивать меня :)
источник
WebView
transparent
. У меня есть фоновое изображение.Попробуйте это решение по ссылке ниже, просто создайте этот класс в папке проекта и используйте его. Он отлично работает для меня :)
Обоснуйте текст в приложении для Android, используя WebView, но представьте интерфейс, подобный TextView?
источник
Обоснование содержимого TextView. Его простые парни просто используют android: justificationMode = "inter_word" в вашем теге TextView.
источник
Попробуйте использовать <
RelativeLayout >
(убедитесь, что fill_parent), затем просто добавьтеandroid:layout_alignParentLeft="true"
иandroid:layout_alignParentRight="true"
к элементам, которые вы хотели бы снаружи слева и справа.БЛАМ, оправдано!
источник
Вы должны установить
а также
источник
Это не совсем оправдывает ваш текст, но
это лучший выбор, который у вас есть.
источник