Intereting Posts
Android: Как определить, будет ли кнопка «Назад» выйти из приложения (т. Е. Это последнее действие, оставшееся в стеке)? Получить номер телефона входящего и исходящего звонка Android – покрасьте растровое изображение в определенное место на холсте Java.lang.NoSuchMethodError: android.app.Notification $ Builder.addAction Прогресс на фоне элемента списка Несоответствие обнаружено в RecyclerView, Как изменить содержимое RecyclerView при прокрутке Почему я не могу попасть в точку останова при запуске приложения Xamarin для Android? Стратегия кэширования для Android-приложения Как увеличить размер кучи приложения для Android? Kotlin и Proguard Разрешения на Android M при совместном использовании данных в других приложениях Почему Images.Media.insertImage возвращает null Индикатор круглого пейджера не выглядит круглым Android – Фрагмент из библиотеки поддержки несовместим с платформой 4.3 Android AudioRecord для сервера по вопросам воспроизведения UDP

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

У меня 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') { 

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