Не переносите текст в Android TextView в аббревиатуре периода

Есть ли способ контролировать, где TextView решает обернуть свой текст? Проблема, с которой я сталкиваюсь, заключается в том, что она хочет обернуть в периоды – так что строка, «доступная в США и Канаде», может быть завершена после периода между U и S. Есть ли способ сказать TextView не Если есть период и пробел, или какой-либо программный способ управления упаковкой?

Я закончил писать свой собственный алгоритм, чтобы разбить текст только на пробелы. Я изначально использовал метод breakText для Paint , но имел некоторые проблемы (которые могут быть фактически разрешены в этой версии кода, но это нормально). Это не мой лучший кусок кода, и его можно было бы немного почистить, но он работает. Поскольку я переопределяю TextView , я просто вызываю это из метода onSizeChanged, чтобы убедиться, что существует допустимая ширина.

private static void breakManually(TextView tv, Editable editable) { int width = tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight(); if(width == 0) { // Can't break with a width of 0. return false; } Paint p = tv.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: //* 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. //* 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(((int) curChar) == ((int) 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) { tv.setText(editable); } } 

Существует spannable называется WrapTogetherSpan. На нем нет документации, но это звучит так, как текст внутри не должен обертываться.

Вы должны определить html-строку с <nobr> следующим образом:

 <string name="mystring">Available in the &lt;nobr&gt;US&lt;/nobr&gt; and Canada</string> 

А затем установите его в TextView с помощью android.text.Html :

 Spanned mystring = Html.fromHtml(activity.getString(R.string.mystring)); TextView textView = (TextView) activity.findViewById(R.id.text); textView.setText(mystring);