Intereting Posts
Apt-зависимости в Android-градиенте – для чего он используется? Установка MonoDevelop / Xamarin studio 4.0.8 Gtk # версия 2.12.16 IllegalStateException, когда MediaCodec.configure Android Для вызова требуется API-уровень 24 (текущий минимум равен 12): android.icu.util.calendar ListView получает позицию прокрутки? Как сделать admob работать с версией Android версии <= 3.2? Как реализовать масштабирование анимации для общего элемента при переходе на активность Android for work – Как проверить, работает ли мое приложение в профиле работы? Android: загрузка файла с защитой от NTLM-аутентификации Как установить драйвер USB для любого устройства Android? Я использую listview add / remove footer для перекрестного приложения listview в версии Android 4.3? Какой лучший телефон для Android, как разработчик Как выровнять элемент в строке таблицы (влево – вправо-вправо) Android – приложение для индексирования приложений Firebase не отображается в предложениях автозаполнения google Исключение Android TextView и null указателя

Остановка текста из разбиения на несколько строк в периоды в веб-адресах

У меня Android TextView, отображающий некоторый текст, и это многострочный. Однако в тексте у меня иногда есть доменные имена; Как я могу остановить TextView от разделения строк на периоды в них?

Например, существует период unicode без юникода?


Чтобы увидеть проблему в действии при упаковке адреса электронной почты, запустите
android create project --target 16 --path demo --package com.example.demo --activity MainActivity
И измените текст в res/layout/main.xml на « Hello World, MyActivity filler text + email foo@foo.com ». Это производит этот вывод на Galaxy S3 (API-уровень 16):

Перенос электронной почты

(Откорректируйте текст, если нужно, посмотрите на упаковку на устройствах с другими размерами экрана. Примечательно, что обертка выполняется правильно в предпросмотре макета Intellij, только на устройстве это ошибка.)

Solutions Collecting From Web of "Остановка текста из разбиения на несколько строк в периоды в веб-адресах"

TLDR;

@Matt McMinn уже продемонстрировал решение этой проблемы здесь , поймайте его. Я только повторю это решение здесь.


Обратите внимание, что эта проблема уже исправлена ​​на уровне платформы в Android 4.2.2. См. Приведенные ниже скриншоты для сравнения слов для той же базы кодов, но разных версий платформы на Galaxy Nexus.

Сравнение переносов слов на Android 4.1.2 и Android 4.2.2

Следовательно, если вы не нацелены на более старые версии Android, вы можете вообще не использовать это исправление.

Код

MainActivity.java :

 package com.example.nobr; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import android.widget.TextView.BufferType; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView helloWorld = (TextView) findViewById(R.id.hello_world); helloWorld.setText(R.string.hello_world, BufferType.EDITABLE); TextView longText = (TextView) findViewById(R.id.long_text); longText.setText(R.string.long_text_with_url, BufferType.EDITABLE); } } 

Activity_main.xml :

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" > <com.example.nobr.NonBreakingPeriodTextView android:id="@+id/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <com.example.nobr.NonBreakingPeriodTextView android:id="@+id/long_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/hello_world" android:layout_below="@+id/hello_world" android:layout_marginTop="20dp" /> </RelativeLayout> 

NonBreakingPeriodTextView.java :

 package com.example.nobr; import android.content.Context; import android.graphics.Paint; import android.text.Editable; import android.util.AttributeSet; import android.util.Log; import android.widget.TextView; public class NonBreakingPeriodTextView extends TextView { private static final String TAG = "NonBreakingPeriodTextView"; public NonBreakingPeriodTextView(Context context) { super(context); } public NonBreakingPeriodTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { Editable editable = getEditableText(); if (editable == null) { Log.d(TAG, "non-editable text"); return; } int width = getWidth() - getPaddingLeft() - getPaddingRight(); if (width == 0) { Log.d(TAG, "zero-length text"); return; } Paint p = getPaint(); float[] widths = new float[editable.length()]; p.getTextWidths(editable.toString(), widths); float curWidth = 0.0f; int lastWSPos = -1; int strPos = 0; final char newLine = '\n'; final String newLineStr = "\n"; boolean reset = false; int insertCount = 0; /* * Traverse the string from the start position, adding each character's width to the total * until: 1) A whitespace character is found. In this case, mark the whitespace position. If * the width goes over the max, this is where the newline will be inserted. 2) A newline * character is found. This resets the curWidth counter. curWidth > width. Replace the * whitespace with a newline and reset the counter. */ while (strPos < editable.length()) { curWidth += widths[strPos]; char curChar = editable.charAt(strPos); if (curChar == newLine) { reset = true; } else if (Character.isWhitespace(curChar)) { lastWSPos = strPos; } else if (curWidth > width && lastWSPos >= 0) { editable.replace(lastWSPos, lastWSPos + 1, newLineStr); insertCount++; strPos = lastWSPos; lastWSPos = -1; reset = true; } if (reset) { curWidth = 0.0f; reset = false; } strPos++; } if (insertCount != 0) { setText(editable); } } } 

Результат

На Android 4.1.2 (Galaxy Nexus)

Word wrap на Android 4.1.2 с исправлением

На Android 2.3.3 (AVD, Nexus One клон)

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

Надеюсь это поможет.

Чтобы сказать, что андроид для анализа ссылок домена в TextView использует этот код в блоке кода TextView:

 android:autoLink="web" 

Это покажет имена доменов в качестве ссылок в приложении и не будет разделять строки.

Использовать это :

Android: singleLine = "true" в xml

Для меня не работало решение @ozbek соответственно @Matt McMinn, мне пришлось менять линию

 else if(Character.isWhitespace(curChar)) 

для

 } else if (curChar == '\u00A0') { 

Но в противном случае отличное решение, спасибо